前言
近期接到一个需求,需要用到Honeywell扫码枪,读了官方源码后,进行一个小总结。
步骤
- 1.添加依赖
将官方提供的DataCollection.jar放入libs
点此下载DataCollection.jar
- 2.manifest注册
<!-- honeywell扫描枪 -->
<uses-permission android:name="com.honeywell.decode.permission.DECODE" />
** 一定要操作这一步,不然无法获取权限进行扫码 **
- 3.Activity关键代码
需实现2个接口
BarcodeReader.BarcodeListener
BarcodeReader.TriggerListener
初始化
//honeywell
AidcManager aidcManager;
BarcodeReader barcodeReader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initAidcManager();
}
private void initAidcManager() {
AidcManager.create(this, manager -> {
//创建AidcManager和BarcodeReader对象
aidcManager = manager;
barcodeReader = aidcManager.createBarcodeReader();
//设置扫描属性,打开扫描功能,按需设置码的格式
try {
barcodeReader.setProperty(BarcodeReader.PROPERTY_CODE_128_ENABLED, true);
barcodeReader.setProperty(BarcodeReader.PROPERTY_GS1_128_ENABLED, true);
barcodeReader.setProperty(BarcodeReader.PROPERTY_QR_CODE_ENABLED, true);
barcodeReader.setProperty(BarcodeReader.PROPERTY_CODE_39_ENABLED, true);
barcodeReader.setProperty(BarcodeReader.PROPERTY_DATAMATRIX_ENABLED, true);
barcodeReader.setProperty(BarcodeReader.PROPERTY_UPC_A_ENABLE, true);
barcodeReader.setProperty(BarcodeReader.PROPERTY_EAN_13_ENABLED, false);
barcodeReader.setProperty(BarcodeReader.PROPERTY_AZTEC_ENABLED, false);
barcodeReader.setProperty(BarcodeReader.PROPERTY_CODABAR_ENABLED, false);
barcodeReader.setProperty(BarcodeReader.PROPERTY_INTERLEAVED_25_ENABLED, false);
barcodeReader.setProperty(BarcodeReader.PROPERTY_PDF_417_ENABLED, false);
barcodeReader.setProperty(BarcodeReader.PROPERTY_CODE_39_MAXIMUM_LENGTH, 10);
barcodeReader.setProperty(BarcodeReader.PROPERTY_CENTER_DECODE, true);
barcodeReader.setProperty(BarcodeReader.PROPERTY_NOTIFICATION_BAD_READ_ENABLED, false);
barcodeReader.setProperty(BarcodeReader.PROPERTY_DATA_PROCESSOR_LAUNCH_BROWSER, false);
barcodeReader.setProperty(BarcodeReader.PROPERTY_TRIGGER_CONTROL_MODE,
BarcodeReader.TRIGGER_CONTROL_MODE_CLIENT_CONTROL);
barcodeReader.claim(); //打开扫描功能
} catch (Exception e) {
GraceToast.shortToast("修改属性失败");
}
//注册Trigger监听器和Barcode监听器
barcodeReader.addTriggerListener(MainActivity.this);
barcodeReader.addBarcodeListener(MainActivity.this);
});
}
数据处理
private String = barcodeData;
@Override
public void onBarcodeEvent(BarcodeReadEvent barcodeReadEvent) {
barcodeData = barcodeReadEvent.getBarcodeData();//获取扫描数据
//如果涉及联网操作,最好开一个线程来做这件事
new WorkThread().start();
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == COMPLETED) {
//todo something
}
}
};
//工作线程
private class WorkThread extends Thread {
@Override
public void run() {
//......处理比较耗时的操作
//处理完成后给handler发送消息
Message msg = new Message();
msg.what = COMPLETED;
handler.sendMessage(msg);
}
}
扳机事件
@Override
public void onTriggerEvent(TriggerStateChangeEvent triggerStateChangeEvent) {
try {
barcodeReader.light(triggerStateChangeEvent.getState());//补光
barcodeReader.aim(triggerStateChangeEvent.getState());//瞄准线
barcodeReader.decode(triggerStateChangeEvent.getState());//解码
} catch (Exception e) {
GraceToast.shortToast("开关扫描功能失败");
}
}
复写方法,及时回收和打开
@Override
protected void onDestroy() {
super.onDestroy();
if (barcodeReader != null) {
try {
barcodeReader.removeTriggerListener(this);
barcodeReader.removeBarcodeListener(this);
barcodeReader.close();
aidcManager.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onResume() {
super.onResume();
if (barcodeReader != null) {
try {
barcodeReader.claim();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onPause() {
super.onPause();
if (barcodeReader != null) {
try {
barcodeReader.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}