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 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 可以在这里添加自定义布局或样式
// 默认情况下会使用库自带的竖屏布局
}
}
3. 在 AndroidManifest.xml 中声明
<application>
<!-- 相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 自定义扫描Activity -->
<!-- 强制竖屏 -->
<activity
android: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">
<Button
android: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;
@Override
protected 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();
}
@Override
protected 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
进一步自定义扫描界面 - 权限处理:包含完整的运行时权限处理逻辑