Android PDA 扫描 通过监听扫描头的广播进行业务的处理

背景:

    本来app是统一使用监听回车来实现pda扫描枪扫描的,结果某天突然出现bug,扫描头设置总是会自动关闭键盘方式输出(哔了狗),然后才有了这段代码,使用广播来实现扫描并且按下键盘回车,之后还是用监听回车来实现,为了兼容(其实是懒)。当然代码上也提供了别的方式,具体可以自行修改哈。实现了就跑,真刺激。

步骤:

1. 查看pda扫描设置广播参数

Android PDA 扫描 通过监听扫描头的广播进行业务的处理_第1张图片

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;
            }
        });

Over~https://blog.csdn.net/Qiyandays/article/details/106257166

你可能感兴趣的:(Android)