使用ZXing开发安卓扫码功能
在安卓开发中实现扫描二维码功能,通常可以借助第三方库,如 ZXing 或 ZBar 来简化开发流程。下面以 ZXing 库为例,详细介绍如何实现扫描二维码的功能:
1. 添加依赖
在项目的 build.gradle
文件里添加 ZXing 库的依赖:
dependencies {implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
}
2. 申请相机权限
在 AndroidManifest.xml
文件中添加相机权限申请:
<uses-permission android:name="android.permission.CAMERA" />
并且在代码里动态请求相机权限:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;public class MainActivity extends AppCompatActivity {private static final int CAMERA_PERMISSION_REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);} else {// 权限已授予,启动扫描startScanning();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限已授予,启动扫描startScanning();} else {// 权限被拒绝,给出提示}}}private void startScanning() {// 启动扫描的代码}
}
3. 启动扫描界面
在需要启动扫描的地方添加如下代码:
import com.journeyapps.barcodescanner.CaptureActivity;
import com.journeyapps.barcodescanner.ScanContract;
import com.journeyapps.barcodescanner.ScanIntentResult;
import com.journeyapps.barcodescanner.ScanOptions;public class MainActivity extends AppCompatActivity {// ... 前面的代码 ...private final ScanContract.ScanResultCallback barcodeCallback = new ScanContract.ScanResultCallback() {@Overridepublic void onActivityResult(ScanIntentResult result) {if (result.getContents() == null) {// 用户取消了扫描} else {// 获取扫描结果String barcodeResult = result.getContents();// 处理扫描结果}}};private void startScanning() {ScanOptions options = new ScanOptions();options.setDesiredBarcodeFormats(ScanOptions.QR_CODE);options.setPrompt("将二维码置于扫描框内");options.setCameraId(0); // 后置摄像头options.setBeepEnabled(true);options.setBarcodeImageEnabled(true);barcodeLauncher.launch(options);}private final androidx.activity.result.ActivityResultLauncher<ScanOptions> barcodeLauncher = registerForActivityResult(new ScanContract(),barcodeCallback);
}
4. 处理扫描结果
在 barcodeCallback
的 onActivityResult
方法中,对扫描结果进行处理。若扫描结果不为空,就可以获取到扫描到的二维码内容:
private final ScanContract.ScanResultCallback barcodeCallback = new ScanContract.ScanResultCallback() {@Overridepublic void onActivityResult(ScanIntentResult result) {if (result.getContents() == null) {// 用户取消了扫描} else {// 获取扫描结果String barcodeResult = result.getContents();// 处理扫描结果,例如显示在 TextView 中TextView resultTextView = findViewById(R.id.resultTextView);resultTextView.setText(barcodeResult);}}
};
完整代码示例
下面是一个完整的 MainActivity
代码示例:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.journeyapps.barcodescanner.CaptureActivity;
import com.journeyapps.barcodescanner.ScanContract;
import com.journeyapps.barcodescanner.ScanIntentResult;
import com.journeyapps.barcodescanner.ScanOptions;public class MainActivity extends AppCompatActivity {private static final int CAMERA_PERMISSION_REQUEST_CODE = 1;private TextView resultTextView;private final ScanContract.ScanResultCallback barcodeCallback = new ScanContract.ScanResultCallback() {@Overridepublic void onActivityResult(ScanIntentResult result) {if (result.getContents() == null) {// 用户取消了扫描} else {// 获取扫描结果String barcodeResult = result.getContents();// 处理扫描结果,例如显示在 TextView 中resultTextView.setText(barcodeResult);}}};private final androidx.activity.result.ActivityResultLauncher<ScanOptions> barcodeLauncher = registerForActivityResult(new ScanContract(),barcodeCallback);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);resultTextView = findViewById(R.id.resultTextView);if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);} else {// 权限已授予,启动扫描startScanning();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限已授予,启动扫描startScanning();} else {// 权限被拒绝,给出提示}}}private void startScanning() {ScanOptions options = new ScanOptions();options.setDesiredBarcodeFormats(ScanOptions.QR_CODE);options.setPrompt("将二维码置于扫描框内");options.setCameraId(0); // 后置摄像头options.setBeepEnabled(true);options.setBarcodeImageEnabled(true);barcodeLauncher.launch(options);}
}
布局文件 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/resultTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:paddingTop="16dp" />
</LinearLayout>
总结
通过上述步骤,你可以在安卓应用中实现扫描二维码的功能。主要步骤包括添加依赖、申请相机权限、启动扫描界面以及处理扫描结果。