在开发扫描枪扫码接收广播条码的时候, 由于厂商如 shit 般的文档和对 Anroid 基础知识的缺失, 走了一些弯路, 以下是广播接收条码并使用的代码实现 :
1 : 动态注册广播
PDA 扫描枪对扫码有强大支持, 在原生自带的扫描服务中可以配置多种扫描模式, 广播传递扫码结果是相对先进的.
首先 PAD 扫描枪在扫码解析后是会自动发送广播的, 注册解析扫码结果的广播后, 可以在广播类中直接获取.
再项目开发环境中, 相应业务代码是写在 Activity 中的, 目前的需求是按下扫码按键, 接收广播数据并在 Activity 中进行相关业务实现.
由于 PDA 扫描枪与 Android 系统不同, PDA 扫描枪上有许多的按键, 这些按键是需要进行监听的, 而在进行监听的过程中出了个小问题, 问题来自 PDA 扫描枪的文档 :
扫描 : keyCode=KEYCODE_UNKNOWN, scanCode=261(注意: 安卓 4.3 为 249)
PTT: keyCode=KEYCODE_UNKNOWN, scanCode= 262
UNKNOWN 我就不说了, 而 scanCode 中的 261 和 249 是完全监听不到扫描按键的.
在开发者模式与 AndroidStudio 进行调试连接后按键按键 AndroidStudio 的运行日志会自动打印按键的 KeyCode:
D/MultiTapKeyListener: keyCode=139 mInputMode=0
最开始的想法是这么写 :
if (keyCode == 139 && event.getAction() == KeyEvent.ACTION_DOWN) {
接收数据启动业务线程
}
对扫码按键进行监听, 按下后系统发送广播, 广播接收器接收到扫描数据存放在静态变量中, 然后在 Activity 中进行获取.
然而广播发送接收和 Activity 代码执行时异步的, Activity 中获取的扫码结果为 null, 而广播接收器则可以接收数据.
2 : 使用接口回调
- package he3.sd.adapter;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.util.Log;
- import android.widget.EditText;
- import android.widget.Toast;
- import he3.sd.util.Base;
- import he3.sd.util.Utility;
- /**
- * Created by asd25 on 2018/7/20 0020.
- */
- public class ScanCodeBroadcastReceiver extends BroadcastReceiver {
- private EditText editText;
- private OnReceiveCode onReceive;
- private String TAG = "ONR";
- @Override
- public void onReceive (Context context, Intent intent){
- Base.barCode = intent.getStringExtra("Scan_context");
- editText.setText(Base.barCode);
- Base.op = Utility.getBarCodeType(Base.barCode);
- editText.clearFocus();
- editText.setText("");
- onReceive.notifynThread(Base.barCode);
- }
- interface OnReceiveCode{
- void notifynThread(String Code);
- }
- public void setOnReceive(OnReceiveCode onReceive,EditText editText) {
- this.onReceive = onReceive;
- this.editText = editText;
- }
- }
在广播接收器中定义接口, 和初始化接口的方法.
在 Activity 中动态注册广播接收器, 实现广播接收器定义的接口 :
- public class ScanOperationAdapterPage extends AppCompatActivity implements View.OnClickListener,ScanCodeBroadcastReceiver.OnReceiveCode{
- ScanCodeBroadcastReceiver setOnReceive;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_adapterlayout);
- userInfo = gson.fromJson(Tools.getUserInfo(ScanOperationAdapterPage.this), User.class);
- initView();
- initActionBar();
- initEvents();
- dataReset();
- initBroadcastReceiver();
/ 注册广播接收器
- }
- private void initBroadcastReceiver() {
- setOnReceive = new ScanCodeBroadcastReceiver();
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction("com.android.scanservice.scancontext");
- registerReceiver(setOnReceive,intentFilter);
- setOnReceive.setOnReceive(this,IP);
- }
- @Override
- public void notifynThread(String Code) {
- Thread scanBarCodeThread = new Thread(new scanBarCodeServer());
- scanBarCodeThread.start();
- }
来源: https://www.cnblogs.com/yangchaojie/p/9660819.html