Android PDA掃描槍廣播接搜條碼並使用
在開發掃描槍掃碼接收廣播條碼的時候,由於廠商如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掃描槍廣播接搜條碼並使用