时人不识凌云木,直待凌云始道高。这篇文章主要讲述Android PDA扫描枪广播接搜条码并使用相关的知识,希望能为你提供帮助。
在开发扫描枪扫码接收广播条码的时候,由于厂商如shit般的文档和对Anroid基础知识的缺失,走了一些弯路,以下是广播接收条码并使用的代码实现 :
1 : 动态注册广播
PDA扫描枪对扫码有强大支持,在原生自带的扫描服务中可以配置多种扫描模式,广播传递扫码结果是相对先进的。
首先 PAD 扫描枪在扫码解析后是会自动发送广播的,注册解析扫码结果的广播后,可以在广播类中直接获取。
再项目开发环境中,相应业务代码是写在Activity中的,目前的需求是按下扫码按键,接收广播数据并在Activity中进行相关业务实现。
由于PDA扫描枪与android系统不同,PDA扫描枪上有许多的按键,这些按键是需要进行监听的,而在进行监听的过程中出了个小问题,问题来自PDA扫描枪的文档 :
扫描 : keyCode=KEYCODE_UNKNOWN,scanCode=261(注意:安卓 4.3 为 249)UNKNOWN 我就不说了,而scanCode中的261和249是完全监听不到扫描按键的。
PTT:keyCode=KEYCODE_UNKNOWN, scanCode= 262
在开发者模式与AndroidStudio进行调试连接后按键按键AndroidStudio的运行日志会自动打印按键的KeyCode:
D/MultiTapKeyListener: keyCode=139mInputMode=0
最开始的想法是这么写 :
if (keyCode == 139 & & event.getAction() == KeyEvent.ACTION_DOWN) { 接收数据启动业务线程 }
对扫码按键进行监听,按下后系统发送广播,广播接收器接收到扫描数据存放在静态变量中,然后在Activity中进行获取。
然而广播发送接收和Activity代码执行时异步的,Activity中获取的扫码结果为null,而广播接收器则可以接收数据。
【Android PDA扫描枪广播接搜条码并使用】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(); }
推荐阅读
- 迈向高阶(优秀Android程序员必知必会的网络基础)
- 高德定位腾讯定位在APP上无法开启定位权限的解决方案
- Android开发资源收集
- Android View 的事件分发原理解析
- mybatis学习 十六 auto_mapping实现连表查询
- Android Studio中进行单元测试
- YII开发第一个例子
- VisualSVN用户和访问权限设置图解
- TortoiseSVN安装详细步骤图解示例