Android 扫码盒子全局接收付款码

另一种全局接收方式已更新:Android 扫码盒子全局接收付款码(全局事件&上层接收&多重下发)_android获取支付盒子扫码内容-CSDN博客文章浏览阅读2k次,点赞2次,收藏4次。实现MainActivity,然后接收到的内容,通过接口回调,依次下发到各个业务还有另一种用EditText接收付款码的方式,地址:https://blog.csdn.net/qq_39731011/article/details/106383787 String barcode = ""; // 收到的码结果 String check = "0000"; //特殊码前缀 如:核销码 @Override public boolean dispatchKeyE.._android获取支付盒子扫码内容https://blog.csdn.net/qq_39731011/article/details/107684794

 (Activity事件全局分发)
        扫码盒子通用接收原理
        1.本质上是键盘输入事件
        2.可以响应EditText的输入事件(前提是获得焦点)

首先写接收源: (假设在MainActivity接收付款码)

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edit_pay_code"
        android:visibility="visible"></EditText>

        接收代码:

public ScanKeyManager scanKeyManager;
    private void initView(){
        EditText edt = findViewById(R.id.edit_pay_code);
        edt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                String str = v.getText().toString().trim();
                Log.e("付款码:", str + "");
                if (str.length() == 18) {//134609522362925502
                    v.setText("");
                    if (scanKeyManager != null)
                        scanKeyManager.analysisKeyEvent(str);
                }
                closeKeyboard();  //事件结束后收回键盘
                return true;
            }
        });
    }
    private void closeKeyboard(){
        if(edt!=null) {
            InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(edt.getWindowToken(), 0);
        }
    }
    public void requestEditText(){

        if(edt!=null){
            edt.setFocusable(true);
            edt.setFocusableInTouchMode(true);
            edt.requestFocus();
        }
    }
/*
 *作者:赵星海
 *时间:2020/5/27 16:22
 *用途: 扫码盒子接收回调
 */
 public class ScanKeyManager {

    public OnScanValueListener mListener;

    public interface OnScanValueListener {
        void onScanValue(String value);
    }

    public ScanKeyManager(OnScanValueListener listener) {
        this.mListener = listener;
    }

    public void analysisKeyEvent(String str) {
        mListener.onScanValue(str+"");
    }

    
}

当你要开启扫码接收的时候:(假设在PopupWindow中获得付款码)

            ((MainActivity) mContext).requestEditText();
            Toast.makeText(mContext, "请出示付款码", Toast.LENGTH_SHORT).show();
            // 语音提醒
            SpeechUtils.getInstance(mContext).speakText("请出示付款码");
            ((MainActivity) mContext).scanKeyManager = new ScanKeyManager(new ScanKeyManager.OnScanValueListener() {
                    @Override
                    public void onScanValue(String value) {
                        // Log.e("扫码结果:",""+value);
                        // Toast.makeText(mContext,"结果"+value,Toast.LENGTH_SHORT).show();
                        if (value == null) return;
                        if (value.trim().substring(0, 2).equals("28")) {
                            goPay(2, value);//1微信 2支付宝 
                        } else {
                            goPay(1, value);
                        }


                    }
            });

付款完成后,需要关闭接收。

((MainActivity) mContext).scanKeyManager = null;

完事,就是这么简单,需要额外注意一点:

如果是在PopupWindow中开启回调的话,由于PopupWindow盖在Activity之上,抢了Activity上EditText的焦点。

所以需要在配置PopupWindow时,要将这个配置改成false:this.setFocusable(false); 

或者注释掉这行代码,因为它默认是false。

    /**
     * 设置窗口的相关属性
     */
    @SuppressLint("InlinedApi")
    private void setPopupWindow() {
        this.setContentView(mPopView);// 设置View
        this.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);// 设置弹出窗口的宽
        this.setHeight(LinearLayout.LayoutParams.MATCH_PARENT);// 设置弹出窗口的高
        // this.setFocusable(true);// 设置弹出窗口可获得焦点

    }

更多内容推荐:https://blog.csdn.net/qq_39731011/category_7565212.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=7565212&sharerefer=PC&sharesource=qq_39731011&sharefrom=from_linkicon-default.png?t=O83Ahttps://blog.csdn.net/qq_39731011/category_7565212.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=7565212&sharerefer=PC&sharesource=qq_39731011&sharefrom=from_link

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵星海(深海呐)

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值