📅  最后修改于: 2023-12-03 15:38:30.308000             🧑  作者: Mango
QR码是一种二维码,被广泛应用于各个领域,如支付、物流、活动等。在Android应用开发中,我们常常需要使用二维码扫描功能来实现某些功能。Zxing库是一个流行的二维码扫描库,他可以在Android应用程序中很容易地集成。
首先需要在项目的build.gradle
文件中添加Zxing库的依赖:
implementation 'com.google.zxing:core:3.3.3'
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
打开布局xml文件,在其中添加一个SurfaceView
用于预览相机画面以及一个Button
用于触发扫描。具体实现如下:
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btn_scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="扫描二维码"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"/>
然后在activity中找到对应的SurfaceView
和Button
,并初始化Zxing
库,具体代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ZXingScannerView.ResultHandler {
private static final int PERMISSION_CODE_CAMERA = 1001;
private ZXingScannerView mScannerView;
private Button mBtnScan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化扫描器View
mScannerView = new ZXingScannerView(this);
FrameLayout frameLayout = findViewById(R.id.fl_scan_frame);
frameLayout.addView(mScannerView);
// 找到扫描按钮并设置监听器
mBtnScan = findViewById(R.id.btn_scan);
mBtnScan.setOnClickListener(this);
}
}
在Android6.0及以上版本,需要在运行时获取相机权限。在activity的onCreate
方法中,检查应用是否被授予相机权限,在没有授权时向用户申请权限:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查是否被授权使用相机
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// 申请权限
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.CAMERA},
PERMISSION_CODE_CAMERA);
return;
}
// 初始化扫描器View
mScannerView = new ZXingScannerView(this);
FrameLayout frameLayout = findViewById(R.id.fl_scan_frame);
frameLayout.addView(mScannerView);
// 找到扫描按钮并设置监听器
mBtnScan = findViewById(R.id.btn_scan);
mBtnScan.setOnClickListener(this);
}
当用户同意或拒绝授权时,调用onRequestPermissionsResult
方法:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 处理相机权限授权结果
if (requestCode == PERMISSION_CODE_CAMERA) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 已授权
// 初始化扫描器View
mScannerView = new ZXingScannerView(this);
FrameLayout frameLayout = findViewById(R.id.fl_scan_frame);
frameLayout.addView(mScannerView);
// 找到扫描按钮并设置监听器
mBtnScan = findViewById(R.id.btn_scan);
mBtnScan.setOnClickListener(this);
} else {
// 拒绝权限
Toast.makeText(this, "相机权限被拒绝,请授予权限后再使用", Toast.LENGTH_SHORT).show();
}
}
}
启动扫描器需要在onResume
方法中调用mScannerView.setResultHandler
方法并传递MainActivity
对象,然后调用mScannerView.startCamera()
方法。
@Override
protected void onResume() {
super.onResume();
// 设置处理结果的handler,并启动相机预览
mScannerView.setResultHandler(this);
mScannerView.startCamera();
}
当扫描器识别到二维码时,调用handleResult
方法处理扫描结果。
@Override
public void handleResult(Result rawResult) {
// 停止预览
mScannerView.stopCamera();
// 显示扫描结果
Toast.makeText(this, rawResult.getText(), Toast.LENGTH_SHORT).show();
// 重新开始预览
mScannerView.startCamera();
}
在activity的onPause
方法中调用mScannerView.stopCamera()
方法停止相机预览。
@Override
protected void onPause() {
super.onPause();
// 关闭相机预览
mScannerView.stopCamera();
}
到此为止,我们已经完成了二维码扫描的实现。
总的来说,使用Zxing库实现二维码扫描非常容易。开发人员只需要引入库,然后按照上述步骤实现相关功能即可。