1. 程式人生 > >Android PDA掃描槍廣播接搜條碼並使用

Android PDA掃描槍廣播接搜條碼並使用

amp gets filter 般的 protected eat art nop min

在開發掃描槍掃碼接收廣播條碼的時候,由於廠商如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();
    }

Android PDA掃描槍廣播接搜條碼並使用