zoukankan      html  css  js  c++  java
  • Android PDA扫描枪广播接搜条码并使用

    在开发扫描枪扫码接收广播条码的时候,由于厂商如shit般的文档和对Anroid基础知识的缺失,走了一些弯路,以下是广播接收条码并使用的代码实现 :

     

      1 : 动态注册广播

        PDA扫描枪对扫码有强大支持,在原生自带的扫描服务中可以配置多种扫描模式,广播传递扫码结果是相对先进的。

        首先 PAD 扫描枪在扫码解析后是会自动发送广播的,注册解析扫码结果的广播后,可以在广播类中直接获取。

        再项目开发环境中,相应业务代码是写在Activity中的,目前的需求是按下扫码按键,接收广播数据并在Activity中进行相关业务实现。

     

    在开发者模式与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之后会自动动态注册扫码广播,接着在广播类中定义回调接口,在接收模块实现方法,就可以在收到条码后执行业务代码。

     

    在 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();
        }
    
  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    update chnroute
    An error "Host key verification failed" when you connect to other computer by OSX SSH
    使用dig查询dns解析
    DNS被污染后
    TunnelBroker for EdgeRouter 后记
    mdadm详细使用手册
    关于尼康黄的原因
    Panda3d code in github
    Python实例浅谈之三Python与C/C++相互调用
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/9660819.html
Copyright © 2011-2022 走看看