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

首先导入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中,主要代码:

@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

其中演示效果:

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


作者:satanmeng
来源:CSDN
原文:https://blog.csdn.net/qq_32857541/article/details/78632426
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值