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