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();
        }
    
  • 相关阅读:
    鼠标放在图片上出现提示
    NSIS调用dll
    IIS7 CMD命令
    NSIS检测
    NSIS修改文件夹访问权限
    NSIS——检测IIS是否安装及版本
    NSIS——检测SQL Server安装版本
    NSIS使用技巧集合
    提供修复界面的NSIS安装包
    NSIS MUI教程
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/9660819.html
Copyright © 2011-2022 走看看