Android 點擊按鈕調用豎屏二維碼掃描
提示:zxing-android-embedded插件已過時,建議更換別的。
場景:Home頁面上有個掃描按鈕,點擊后打開攝像頭完成掃描功能,掃描時要求豎屏。
方案:使用zxing-android-embedded插件,新建獨立的activity,設置為豎屏。
1. 添加依賴
在 app 的 build.gradle
中添加:
dependencies {implementation 'com.journeyapps:zxing-android-embedded:4.3.0'implementation 'androidx.appcompat:appcompat:1.4.1'
}
2. 創建自定義豎屏掃描 Activity
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.journeyapps.barcodescanner.CaptureActivity;/*** 自定義豎屏掃描Activity*/
public class VerticalScannerActivity extends CaptureActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 可以在這里添加自定義布局或樣式// 默認情況下會使用庫自帶的豎屏布局}
}
3. 在 AndroidManifest.xml 中聲明
<application><!-- 相機權限 --><uses-permission android:name="android.permission.CAMERA" /><!-- 自定義掃描Activity --><!-- 強制豎屏 --><activityandroid:name=".VerticalScannerActivity"android:screenOrientation="portrait"/>
</application>
4. 創建按鈕布局 (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_scan"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="掃描二維碼"android:textSize="18sp"android:padding="16dp"/>
</LinearLayout>
5. 實現 MainActivity
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;public class MainActivity extends AppCompatActivity {private static final int SCAN_REQUEST_CODE = 1001;private TextView tvResult;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btnScan = findViewById(R.id.btn_scan);tvResult = findViewById(R.id.tv_result);btnScan.setOnClickListener(v -> startQrScanner());}private void startQrScanner() {// 創建掃描器實例IntentIntegrator integrator = new IntentIntegrator(this);// 配置掃描參數// integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE); // 只掃描QR碼integrator.setPrompt("將二維碼放入框內掃描"); // 提示文字integrator.setCameraId(0); // 使用后置攝像頭integrator.setBeepEnabled(false); // 關閉提示音integrator.setBarcodeImageEnabled(false); // 不保存掃描圖片// integrator.setOrientationLocked(true); // 鎖定豎屏integrator.setCaptureActivity(VerticalScannerActivity.class); // 使用自定義豎屏Activity// 啟動掃描integrator.initiateScan();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 處理掃描結果IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);if (result != null) {if (result.getContents() == null) {Toast.makeText(this, "掃描已取消", Toast.LENGTH_SHORT).show();} else {// 顯示掃描結果tvResult.setText("掃描結果: " + result.getContents());}}}
}
6. 配置方法
方法 說明
setDesiredBarcodeFormats(String... formats)
設置要掃描的條碼類型
setPrompt(String prompt)
設置提示文字
setCameraId(int cameraId)
設置攝像頭ID (0=后置, 1=前置)
setBeepEnabled(boolean enabled)
設置掃描成功時是否播放提示音
setBarcodeImageEnabled(boolean enabled)
設置是否保存掃描的條碼圖片
setOrientationLocked(boolean locked)
是否鎖定屏幕方向
setCaptureActivity(Class<?> captureActivity)
設置自定義掃描Activity
setTimeout(long timeout)
設置超時時間(毫秒)
setTorchEnabled(boolean enabled)
是否啟用手電筒功能
addExtra(String key, Object value)
添加額外參數
7. 特點說明
- 強制豎屏:通過
android:screenOrientation="portrait"
確保掃描界面保持豎屏 - 簡潔集成:使用
IntentIntegrator
簡化掃描流程 - 結果處理:在
onActivityResult
中處理掃描結果 - 自定義界面:可以通過繼承
CaptureActivity
進一步自定義掃描界面 - 權限處理:包含完整的運行時權限處理邏輯