Android开发 zxing的使用
简介
zxing是一个开源的二维码扫描库,可以用于Android开发中的二维码相关功能。本文将介绍如何在Android应用中使用zxing库进行二维码扫描功能的开发。
准备工作
在开始之前,我们需要进行一些准备工作。首先,我们需要在项目的build.gradle文件中添加zxing库的依赖:
implementation 'com.google.zxing:core:3.4.0'
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
接下来,我们需要在AndroidManifest.xml文件中添加相应的权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
创建扫描界面
首先,我们需要创建一个用于扫描二维码的界面。在布局文件中,我们可以使用一个SurfaceView来显示相机预览,并添加一个按钮用于触发扫描操作。
<RelativeLayout xmlns:android="
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/camera_preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/scan_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Scan" />
</RelativeLayout>
接下来,我们需要在扫描界面对应的Activity中处理相应的逻辑。首先,我们需要初始化相机并设置扫描回调函数:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.zxing.Result;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.CompoundBarcodeView;
import java.util.List;
public class ScanActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private static final int CAMERA_PERMISSION_REQUEST_CODE = 101;
private CompoundBarcodeView barcodeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
barcodeView = findViewById(R.id.barcode_view);
barcodeView.setStatusText("Place barcode inside the viewfinder");
SurfaceView surfaceView = findViewById(R.id.camera_preview);
surfaceView.getHolder().addCallback(this);
}
@Override
protected void onResume() {
super.onResume();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
barcodeView.resume();
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
CAMERA_PERMISSION_REQUEST_CODE);
}
}
@Override
protected void onPause() {
super.onPause();
barcodeView.pause();
}
@Override
public 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) {
barcodeView.resume();
} else {
// Handle camera permission denied
}
}
}
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
barcodeView.getBarcodeView().setSurfaceHolder(holder);
}
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
}
}
在这段代码中,我们首先检查相机权限是否被授予。如果没有被授予,我们会请求相机权限。然后,我们在onResume()方法中继续相机的预览,并在onPause()方法中暂停相机的预览。在surfaceCreated()方法中,我们设置SurfaceHolder以便于相机预览。
接下来,我们还需要添加扫描二维码的回调函数。在onCreate()方法中,我们为扫描按钮添加点击事件,并在回调函数中处理