Android扫码ZXing

目录

1. 获取权限

2. 添加依赖

3. 引入

4. 简易扫码

(1) 启动扫码

(2) 获取扫描结果

5. 自定义扫码界面

(1) 自定义Activity的XML文件

(2) 自定义Activity的Java文件

(3) 使用setCaptureActivity()方法取代CaptureActivity

6. ZXing开启手电筒


1. 获取权限

请注意动态申请及重写申请结果返回方法。

2. 添加依赖

//Gradle Scripts -> build.gradle(Module:app)
implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:4.2.0'

3. 引入

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

4. 简易扫码

(1) 启动扫码

通常,扫码是由一个按钮触发,跳转至扫码Activity(CaptureActivity)。

setDesiredBarcodeFormats()方法用于设置扫码的类型(不同类型间逗号分隔):

  1. Code 39 条形码

    • 数据容量:通常用于较短的文本字符串,支持数字、大写字母和一些特殊字符。
    • 字符集:包含数字 0-9、大写字母 A-Z 和一些特殊字符(如空格、破折号等)。
    • 用途:广泛用于工业、物流、标签等领域,用于标识物品或包装。
  2. Code 93 条形码

    • 数据容量:比 Code 39 更高,可以编码更多字符。
    • 字符集:支持所有的 ASCII 字符。
    • 用途:常用于标签、物流追踪、文档标识等领域,提供了更高的数据密度和安全性。
  3. Code 128 条形码

    • 数据容量:是一种高密度条形码,具有更高的数据编码能力。
    • 字符集:支持所有的 128 个 ASCII 字符,包括数字、字母、符号等。
    • 用途:广泛应用于零售、物流、运输等领域,用于编码大量字符和数据。
  4. UPC-A 条形码

    • 数据容量:用于编码商品标识符,可以编码 12 个数字。
    • 字符集:仅限数字。
    • 用途:主要用于零售业,标识商品,常见于北美地区。
  5. UPC-E 条形码

    • 数据容量:压缩版本的 UPC-A,可以编码 6 个数字。
    • 字符集:仅限数字。
    • 用途:通常用于小型商品包装,空间有限的情况下采用。
  6. EAN-8 条形码

    • 数据容量:编码 8 个数字。
    • 字符集:仅限数字。
    • 用途:类似 UPC-E,用于小型商品包装,空间有限的情况下采用。
  7. EAN-13 条形码

    • 数据容量:编码 13 个数字。
    • 字符集:仅限数字。
    • 用途:在全球范围内用于标识商品,常见于欧洲和其他地区
  8. QR码(Quick Response Code): 如前所述,这是一种由Denso Wave开发的二维码,最初设计用于跟踪汽车零部件。它被广泛应用于各种领域,尤其是移动支付和信息快速传递。

  9. Data Matrix: 这是另一种常见的二维码类型,它是由美国公司International Data Matrix(ID Matrix)于1989年创建的。Data Matrix常用于工业标识和物流管理。

  10. PDF417: 这是一种二维码,其名称源自它的编码规范,即PDF(Portable Data File)417。它常用于存储大量数据,如驾驶执照、护照和车辆注册证明等。

  11. Aztec Code: 这是一种用于存储数据的二维码,通常被用于票务和航空领域。

  12. 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();//启动扫描器
                
    }
});

(2) 获取扫描结果

扫码界面本身也是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);
}

5. 自定义扫码界面

扫码页面是由initiateScan()方法启动,不断查看源码可知,该方法本质是启动了一个名为CaptureActivity的页面

我们可以创建一个新的Activity并用setCaptureActivity()方法取代CaptureActivity。

为了使自定义的Activity具有CaptureActivity的能力,我们首先在Activity中设置一个com.journeyapps.barcodescanner.DecoratedBarcodeView控件,然后将CaptureActivity的Java代码复制到Activity的Java文件中并修改部分id即可。还可以在Activity添加更多的控件以满足我们的自定义需求。

(1) 自定义Activity的XML文件

app:zxing_preview_scaling_strategy="centerCrop"这个属性指定了预览图像的缩放策略。在这里,设置为 centerCrop,表示预览图像将按比例缩放并截取中间部分以适应。

app:zxing_use_texture_view="false"这个属性指定是否使用 TextureView 来显示相机预览。在这里,设置为 false,表示不使用 TextureView。不使用时为四周透明。



    
        
        
        
    

(2) 自定义Activity的Java文件

将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);
    }
}

(3) 使用setCaptureActivity()方法取代CaptureActivity

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();//启动扫描器

     }
});

6. ZXing开启手电筒

扫码时经常需要使用手电筒,但是因为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;
        }
    }
 });

你可能感兴趣的:(android,java)