android 手持扫码设备获取扫码回调内容实践
Github地址:https://github.com/xieyuhai/qr
最近参加一个扫描设备(扫码枪扫描)的开发,内置扫码枪功能,扫描设备的二维码接收模式有三种,设置界面如下:
其中前两种的接收模式比较类似,只需要布局一个文本框即可
根据文本框的焦点设置值,这种方式有点类似模拟的键盘输入(比较不可控),当键盘弹出并且中文输入的情况,会出现二维码返回数据中的一些英文以中文的方式显示在文本框了,客户使用的时候会感觉不太友好,也不太符合需求,于是使用广播的方式来获得扫码后的回调数据。
扫码部分硬件已经实现,主要是获得扫码的回调
MainActivity.java
注册广播指定发送广播的action
public class MainActivity extends Activity implements QRListener {
private EditText qrEditText;
private TextView deleteTextView;
private QRReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
initReceiver();
}
动态注册广播
private void initReceiver() {
receiver = new QRReceiver();
receiver.setListener(this);
registerReceiver(receiver, new IntentFilter(“com.barcode.sendBroadcast”));
}
private void initEvent() {
deleteTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
qrEditText.setText("");
}
});
}
private void initView() {
qrEditText = (EditText) findViewById(R.id.qrEditText);
deleteTextView = (TextView) findViewById(R.id.deleteTextView);
}
//二维码回调数据设置显示
@Override
public void getQRData(String data) {
qrEditText.setText(data);
}
//
@Override
protected void onDestroy() {
if (receiver != null) {
unregisterReceiver(receiver);
receiver = null;
System.gc();
}
super.onDestroy();
}
QRReceiver.java
通过广播接收二维码的数据并将数据传递
public class QRReceiver extends BroadcastReceiver {
private QRListener listener;
public void setListener(QRListener listener) {
this.listener = listener;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null && action.startsWith("com.barcode.sendBroadcast")) {
String data = intent.getStringExtra("BARCODE");
if (listener != null) {
listener.getQRData(data);
}
Toast.makeText(context, data, Toast.LENGTH_SHORT).show();
}
}
}