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();
}
}
}