背景:
本来app是统一使用监听回车来实现pda扫描枪扫描的,结果某天突然出现bug,扫描头设置总是会自动关闭键盘方式输出(哔了狗),然后才有了这段代码,使用广播来实现扫描并且按下键盘回车,之后还是用监听回车来实现,为了兼容(其实是懒)。当然代码上也提供了别的方式,具体可以自行修改哈。实现了就跑,真刺激。
步骤:
1. 查看pda扫描设置广播参数
2. 定义广播接收者
package com.hxb.common.util;
import android.app.Instrumentation;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.EditText;
import com.hxb.base.BaseApplication;
/**
* 条码通知
* 广播接收后模拟回车输出
*
* @author h6900
*/
public class ScanCodeBroadcastReceiver extends BroadcastReceiver {
/**
* 需要监听pda扫描枪的文本框
*/
private EditText[] editTexts;
/**
* pda扫描枪监听
*/
private OnReceiveCode onReceive;
/**
* 传入的页面classname
*/
private String TAG = "";
@Override
public void onReceive(Context context, Intent intent) {
String code = intent.getStringExtra("barcode_string");
Log.i(TAG, "--" + BaseApplication.isTopActivity(TAG));
if (BaseApplication.isTopActivity(TAG)) {
int id = outputEditTextByFocus(code);
onReceive.notifyThread(code, id);
}
}
/**
* 给获取焦点的输入框输出广播
* @param code 广播返回的code
* @return 当前获取焦点的输入框id
*/
private int outputEditTextByFocus(String code){
for (EditText editText : editTexts) {
Log.i(TAG, editText.hasFocus() + "--" + editText.getId() + "");
if (editText.hasFocus()) {
Log.i(TAG, editText.getId() + "");
editText.setText(code);
new Thread(new Runnable() {
@Override
public void run() {
// 模拟回车按键
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_ENTER);
}
}).start();
return editText.getId();
}
}
return 0;
}
public interface OnReceiveCode {
/**
* 通知
*
* @param code
* @param id
*/
void notifyThread(String code, int id);
}
public void setOnReceive(String tag, OnReceiveCode onReceive, EditText[] editTexts) {
this.TAG = tag;
this.onReceive = onReceive;
this.editTexts = editTexts;
}
}
3. 在application中定义获取当前app中最上层Activity
/**
* @author h6900
*/
public class BaseApplication extends Application implements Application.ActivityLifecycleCallbacks {
private static String topActivity;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
initSDK(this);
}
/**
*
* 初始化一些第三方框架
* @param baseApplication
*/
private void initSDK(BaseApplication baseApplication) {
//ARouter
ARouter.openLog(); //打印日志
ARouter.openDebug();
//初始化ARouter
ARouter.init(this);
}
/**
* 获取最上层activity名称
* @param tag
* @return
*/
public static boolean isTopActivity(String tag) {
if (TextUtils.isEmpty(topActivity)) {
return false;
}
return topActivity.contains(tag);
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
Log.i("APP",activity.getClass().getName());
topActivity = activity.getClass().getName();
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
4. 在baseActivity中定义init广播方法
private ScanCodeBroadcastReceiver setOnReceive;
protected final String TAG = this.getClass().getName();
protected void initBarcodeBroadcastReceiver(ScanCodeBroadcastReceiver.OnReceiveCode onReceiveCode, EditText[] editTexts) {
if (Declare.pdaBroadcast != null
&& !TextUtils.isEmpty(Declare.pdaBroadcast.getAction())
&& !TextUtils.isEmpty(Declare.pdaBroadcast.getStringExtra())) {
setOnReceive = new ScanCodeBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
//"android.intent.ACTION_DECODE_DATA"
intentFilter.addAction(Declare.pdaBroadcast.getAction());
registerReceiver(setOnReceive, intentFilter);
setOnReceive.setOnReceive(TAG,onReceiveCode, editTexts);
}
}
5. 在onDestroy中销毁广播接收者
@Override
protected void onDestroy() {
super.onDestroy();
//销毁
if (setOnReceive != null) {
unregisterReceiver(setOnReceive);
}
}
6. 在页面中使用
initBarcodeBroadcastReceiver((Code,id) -> {
//传出code与id
}, new EditText[]{workOrder});
7. 也可以统一在回车事件中处理,如果不需要可以自行修改步骤2中的类,使用自定义监听或者使用回车监听都可以
workOrder.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
// 监听到回车键
//do some
}
return false;
}
});