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