目录
1. 获取权限
2. 添加依赖
3. 引入
4. 简易扫码
(1) 启动扫码
(2) 获取扫描结果
5. 自定义扫码界面
(1) 自定义Activity的XML文件
(2) 自定义Activity的Java文件
(3) 使用setCaptureActivity()方法取代CaptureActivity
6. ZXing开启手电筒
请注意动态申请及重写申请结果返回方法。
//Gradle Scripts -> build.gradle(Module:app)
implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:4.2.0'
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
通常,扫码是由一个按钮触发,跳转至扫码Activity(CaptureActivity)。
setDesiredBarcodeFormats()方法用于设置扫码的类型(不同类型间逗号分隔):
Code 39 条形码:
Code 93 条形码:
Code 128 条形码:
UPC-A 条形码:
UPC-E 条形码:
EAN-8 条形码:
EAN-13 条形码:
QR码(Quick Response Code): 如前所述,这是一种由Denso Wave开发的二维码,最初设计用于跟踪汽车零部件。它被广泛应用于各种领域,尤其是移动支付和信息快速传递。
Data Matrix: 这是另一种常见的二维码类型,它是由美国公司International Data Matrix(ID Matrix)于1989年创建的。Data Matrix常用于工业标识和物流管理。
PDF417: 这是一种二维码,其名称源自它的编码规范,即PDF(Portable Data File)417。它常用于存储大量数据,如驾驶执照、护照和车辆注册证明等。
Aztec Code: 这是一种用于存储数据的二维码,通常被用于票务和航空领域。
MaxiCode: 这是由美国邮政服务用于自动识别包裹的一种二维码。
在中国常用的条码格式为:EAN-13 和 UPC-A 。
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
IntentIntegrator intentIntegrator=new IntentIntegrator(MainActivity.this);
//设置所需扫描的条码格式----可有多种,且可同时有条码和二维码
intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.CODE_39,IntentIntegrator.CODE_93,IntentIntegrator.CODE_128,IntentIntegrator.UPC_A,IntentIntegrator.UPC_E,IntentIntegrator.EAN_8,IntentIntegrator.EAN_13);
intentIntegrator.setBeepEnabled(true);//扫描成功是否有提示音
intentIntegrator.setPrompt("扫描");//提示字符串
intentIntegrator.setCameraId(0);//设置摄像头,0为背摄,1为正摄
intentIntegrator.setOrientationLocked(false);//是否方向锁定
intentIntegrator.setBarcodeImageEnabled(true);//是否保存扫描成功的图片
intentIntegrator.initiateScan();//启动扫描器
}
});
扫码界面本身也是Activity,所以想要获取扫码结果可重写onActivityResult()方法。
//本码中TextView用于显示扫码结果
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
IntentResult intentResult=IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
//判断是否为扫码返回的
if(intentResult!=null){
//判断是否扫描成功
if(intentResult.getContents()!=null){
textView.setText(intentResult.getContents());
}
else {
textView.setText("扫描无结果");
}
}
super.onActivityResult(requestCode, resultCode, data);
}
扫码页面是由initiateScan()方法启动,不断查看源码可知,该方法本质是启动了一个名为CaptureActivity的页面。
我们可以创建一个新的Activity并用setCaptureActivity()方法取代CaptureActivity。
为了使自定义的Activity具有CaptureActivity的能力,我们首先在Activity中设置一个com.journeyapps.barcodescanner.DecoratedBarcodeView控件,然后将CaptureActivity的Java代码复制到Activity的Java文件中并修改部分id即可。还可以在Activity添加更多的控件以满足我们的自定义需求。
app:zxing_preview_scaling_strategy="centerCrop"
:这个属性指定了预览图像的缩放策略。在这里,设置为 centerCrop
,表示预览图像将按比例缩放并截取中间部分以适应。
app:zxing_use_texture_view="false"
:这个属性指定是否使用 TextureView
来显示相机预览。在这里,设置为 false
,表示不使用 TextureView
。不使用时为四周透明。
将CaptureActivity的Java代码复制并修改部分id。
public class MyCaptureActivity extends AppCompatActivity {
private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
barcodeScannerView = initializeContent();
capture = new CaptureManager(this, barcodeScannerView);
capture.initializeFromIntent(getIntent(), savedInstanceState);
capture.decode();
}
/**
* Override to use a different layout.
*
* @return the DecoratedBarcodeView
*/
protected DecoratedBarcodeView initializeContent() {
//此处修改
//修改前setContentView(R.layout.zxing_capture);
//修改前return (DecoratedBarcodeView)findViewById(R.id.zxing_barcode_scanner);
setContentView(R.layout.activity_my_capture);
return (DecoratedBarcodeView)findViewById(R.id.decoratedBarcodeView);
}
@Override
protected void onResume() {
super.onResume();
capture.onResume();
}
@Override
protected void onPause() {
super.onPause();
capture.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
capture.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
capture.onSaveInstanceState(outState);
}
@SuppressLint("MissingSuperCall")
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
capture.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
}
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
IntentIntegrator intentIntegrator=new IntentIntegrator(MainActivity.this);
//设置所需扫描的条码格式----可有多种,且可同时有条码和二维码
intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.EAN_13,IntentIntegrator.UPC_A);
intentIntegrator.setBeepEnabled(true);//扫描成功是否有提示音
intentIntegrator.setPrompt("扫描");//提示字符串
intentIntegrator.setCameraId(0);//设置摄像头,0为背摄,1为正摄
intentIntegrator.setOrientationLocked(false);//是否方向锁定
intentIntegrator.setBarcodeImageEnabled(true);//是否保存扫描成功的图片
//使用自定义的Activity
intentIntegrator.setCaptureActivity(MyCaptureActivity.class);
intentIntegrator.initiateScan();//启动扫描器
}
});
扫码时经常需要使用手电筒,但是因为ZXing已经启动了一个相机所以无法使用CameraManager来开启手电筒;并且因为没有捕获通道所以也不能使用设置捕获请求开启手电筒。
但ZXing中的DecoratedBarcodeView控件类(即com.journeyapps.barcodescanner.DecoratedBarcodeView控件)提供了启动和关闭手电筒的方法。可以在自定义的Activity中通过DecoratedBarcodeView开关手电筒。
启动手电筒:.setTorchOn()
关闭手电筒:.setTorchOff()
可以在自定义Activity的onCreate()中使用这些方法。
Button torchButton=findViewById(R.id.torchButton);
torchButton.setOnClickListener(new View.OnClickListener() {
int i=0;
public void onClick(View view) {
if(i==0){
//启动手电筒
barcodeScannerView.setTorchOn();
i=1;
} else if (i==1) {
//关闭手电筒
barcodeScannerView.setTorchOff();
i=0;
}
}
});