📅  最后修改于: 2023-12-03 14:59:15.279000             🧑  作者: Mango
QR码和条形码是现代数字世界中十分常见的编码方式,它们广泛应用于商品条码、物流标签、票据、二维码等等。在Android开发中,我们可以通过使用相机来实现扫描扫描二维码或条形码。
本文将介绍如何在Android应用中集成QR码和条形码的扫描功能,并且展示如何解析扫描得到的二维码或条形码信息。
在集成QR码和条形码扫描功能之前,我们首先需要选择一个扫描库。这里我们推荐使用Google开源的Barcode Scanning API。这个库可以快速便捷地集成扫描功能,并且支持多种类型的二维码和条形码。
在 build.gradle
文件中添加以下依赖:
dependencies {
// ...
implementation 'com.google.mlkit:barcode-scanning:17.1.1'
}
在使用相机进行扫描之前,我们需要请求相机权限。添加以下代码在应用程序运行时请求相机权限:
private static final int PERMISSION_CAMERA = 1;
private void requestCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA);
} else {
startScanning(); // 相机权限已授权 直接开始扫描
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_CAMERA) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startScanning(); // 已授权 开始扫描
} else {
// 拒绝授权
Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();
}
}
}
我们需要创建一个布局文件作为扫描界面。这里使用一个 SurfaceView
来显示相机画面:
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
创建 BarcodeScanner
对象,并在 SurfaceView
上进行初始化:
private SurfaceView surfaceView;
private BarcodeScanner scanner;
private boolean isScanning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surface_view);
startCameraPreview();
}
private void startCameraPreview() {
scanner = BarcodeScanning.getClient();
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
scanner.startScan(holder);
isScanning = true;
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
scanner.stopScan();
isScanning = false;
}
});
}
在正式开始扫描之前,请确保相机权限已经被授权。
无论是QR码还是条形码,我们都可以通过 Barcode
对象来解析扫描结果:
private void processScanningResult(List<Barcode> barcodes) {
if (barcodes == null || barcodes.size() == 0) {
Toast.makeText(this, "No barcodes detected", Toast.LENGTH_SHORT).show();
return;
}
for (Barcode barcode : barcodes) {
int valueType = barcode.getValueType();
switch (valueType) {
case Barcode.TYPE_URL:
String title = barcode.getTitle();
String url = barcode.getUrl().getUrl();
Log.d("BARCODE INFO", "title: " + title + ", url: " + url);
break;
case Barcode.TYPE_PHONE:
String phoneNumber = barcode.getPhone().getNumber();
Log.d("BARCODE INFO", "phone number: " + phoneNumber);
break;
case Barcode.TYPE_EMAIL:
String address = barcode.getEmail().getAddress();
String subject = barcode.getEmail().getSubject();
String body = barcode.getEmail().getBody();
Log.d("BARCODE INFO", "address: " + address + ", subject: " + subject + ", body: " + body);
break;
// 其他类型
default:
String value = barcode.getRawValue();
Log.d("BARCODE INFO", "value: " + value);
break;
}
}
}
集成QR码和条形码扫描功能,对于很多需要用户输入信息的应用程序有很好的用户体验。而Google提供的Barcode Scanning API是一款好用实用的库,既支持QR码和条形码,也支持多种类型的条形码识别。将此库与自己的应用程序结合使用,可以快速、稳定地获得二维码和条形码扫描功能。