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

来源:互联网 发布:if you中文网络歌手 编辑:程序博客网 时间:2024/06/05 11:03

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

 

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


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

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

解析条形码

 

1.在xml中写入控件,我这里是一个TextView用来接收返回的ISBN码和一个Button用来触发扫码事件
<TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text=""    android:paddingTop="10dp"    android:paddingLeft="30dp"    android:textSize="25dp"    android:id="@+id/isbn"/><Button    android:id="@+id/button"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginRight="20dp"    android:layout_alignParentRight="true"    android:text="扫一扫" />

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来显示生成的条形码

<EditText    android:layout_width="250dp"    android:layout_height="wrap_content"    android:text=""    android:paddingTop="10dp"    android:paddingLeft="30dp"    android:textSize="25dp"    android:id="@+id/text"/><Button    android:id="@+id/create"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginRight="20dp"    android:layout_alignParentRight="true"    android:text="生成" /><ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:id="@+id/image"    android:layout_gravity="center"    android:layout_marginTop="50dp"/>

 
2.在对应的Activity中写入代码,比如为MainActivity,为button注册一个监听,将获取到的字符串转成Bitmap格式图片设置到ImageView中,主要代码
@Overridepublic 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

其中演示效果:

 

 

 

 

我用了一个别人写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中;


 
原创粉丝点击