Android Studio使用zxing库扫描并解析条形码

首先导入zxing库,打开app下的build.gradle位置如下。

 Android Studio使用zxing库扫描并解析条形码_第1张图片

打开后在如下位置后,在dependencies中

Android Studio使用zxing库扫描并解析条形码_第2张图片

添加划线的那行代码,即:

compile 'com.journeyapps:zxing-android-embedded:3.5.0'

解析条形码

 

1.在xml中写入控件,我这里是一个TextView用来接收返回的ISBN码和一个Button用来触发扫码事件
 
  



2.在对应的Activity中写入代码,比如为MainActivity,为button注册一个监听,利用zxing中的类IntentIntegrator来设置属性,主要代码
 
  
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        IntentIntegrator integrator = new IntentIntegrator(getActivity());
        // 设置要扫描的条码类型,ONE_D_CODE_TYPES:一维码,QR_CODE_TYPES-二维码
        integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
        integrator.setCaptureActivity(ScanActivity.class); //设置打开摄像头的Activity
        integrator.setPrompt("请扫描ISBN"); //底部的提示文字,设为""可以置空
        integrator.setCameraId(0); //前置或者后置摄像头
        integrator.setBeepEnabled(true); //扫描成功的「哔哔」声,默认开启
        integrator.setBarcodeImageEnabled(true);
        integrator.initiateScan();
    }
});

3.再新建一个Activity,这个Activity是用来打开摄像头的。我这里的名字叫ScanActivity,主要代码:
 
  
public class ScanActivity extends CaptureActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

4.在MainActivity中写入如下代码,接收扫码后返回的值。其中result为获取的值,我这里将它显示到textview中。主要代码:
 
  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if (scanResult != null) {
        String result = scanResult.getContents();
isbn.setText(result);
    }
}

 

生成条形码

1.在xml中写入控件,我这里是一个EditView用来输入一个字符串,一个Button用来触发生成条形码事件,还有一个ImageView来显示生成的条形码

 
  



 
2.在对应的Activity中写入代码,比如为MainActivity,为button注册一个监听,将获取到的字符串转成Bitmap格式图片设置到ImageView中,主要代码
 
  
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    image=(ImageView)getActivity().findViewById(R.id.image);
    text=(TextView) getActivity().findViewById(R.id.text);
    btn=(Button) getActivity().findViewById(R.id.create);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            test=text.getText().toString();
            Bitmap a=encodeAsBitmap(test);
            image.setImageBitmap(a);
        }
    });
}


Bitmap encodeAsBitmap(String str) {
    Bitmap bitmap = null;
    BitMatrix result = null;
    MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    try {
        //查看各参数解析
        result = multiFormatWriter.encode(str, BarcodeFormat.CODE_128, 800, 300);
        // 使用 ZXing Android Embedded 要写的代码
        BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
        bitmap = barcodeEncoder.createBitmap(result);
    } catch (WriterException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException iae) {
        return null;
    }
    return bitmap;
}

其中BarcodeFormat有各种属性,下边是一些属性的含义,这里我用的是Code 128
 

UPC-A是一种国际通用的编码格式,由12个数字构成,EAN-13是在UPC-A基础上的一种扩充(多了一个数字)。

Code39或者Code 128的Barcode,那么这很就可能是一个快递编码

QRCode,就是我们经常用手机扫一扫的二维码

 

我写了一个小demo

GitHub地址:

 https://github.com/satanmeng/Tomcat

其中演示效果:

 Android Studio使用zxing库扫描并解析条形码_第3张图片

 

 Android Studio使用zxing库扫描并解析条形码_第4张图片

 

我用了一个别人写bottomBar的插件

compile 'com.roughike:bottom-bar:2.3.1'

将解析条形码放在了第一个页面(对应的xml-fragment1.xml Activity-fragmentone.java),生成条形码放在了第二页面(对应的xml-fragment2.xml Activity-fragmenttwo.java)

 

其中有一个疑惑,解析条形码返回的结果是在MainActivity中,而我要将这个结果写到碎片中的TextView中,我用了网上的方法用

LayoutInflater.from(MainActivity.this).inflate(R.layout.fragment1,null);

获取到碎片对应的view在找TextView也不行,最后我在fragmentone.java写了一个静态方法:

 
  
public static void settext(String result){
    isbn.setText(result);
}


用来将结果写到TextView中;


 
 

你可能感兴趣的:(安卓)