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
来源:****
原文:https://blog.****.net/qq_32857541/article/details/78632426
版权声明:本文为博主原创文章,转载请附上博文链接!