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
进一步自定义扫描界面 - 权限处理:包含完整的运行时权限处理逻辑