Android 扫码枪监听封装

简介: 一、参考1、常用keycode一、简述1、设备:扫码枪其实相当于一个物理输入设备,如果软键盘打开的话能明显感觉到其内容在输入2、问题:2.1、不能扫出中文来(可能和扫码枪设备,配置有关系)2.

一、参考

1、常用keycode

一、简述

1、设备:扫码枪其实相当于一个物理输入设备,如果软键盘打开的话能明显感觉到其内容在输入
2、问题:
2.1、不能扫出中文来(可能和扫码枪设备,配置有关系)
2.2、在光标放到输入框有软键盘弹出的时候,扫码出来的字符顺序是混乱的(估计和硬件有关系)
2.3、没有合适的监听扫码结果的api

三、解决

为了解决以上问题另加上实现各种业务,故而研究下,有这么几点:
1、一定需要一个EditText(充当扫码枪输入的容器)
2、有弹出软键盘的,扫码内容可能会顺序不对和乱码,需要关闭软键盘,内容正确
3、扫码出来后,一般扫码枪是有标识符结束的,一般是键盘上的
keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==KeyEvent.ACTION_DOWN
返回当前扫码内容
4、最后会有KeyEvent.KEYCODE_DPAD_DOWN,到其他view上去
5、还没能解决如何设置timeout问题,让接口提示扫码失败  ̄□ ̄||
代码
/**
 * Created by wujn on 2018/4/19.
 * Version : v1.0
 * Function: android hardware device - Scanner
 *
 * 扫码枪:相当于软键盘使用的
 * 1、一定需要一个EditText(充当扫码枪输入的容器)
 * 2、有弹出软键盘的,扫码内容可能会顺序不对和乱码,需要关闭软键盘,内容正确
 * 3、扫码出来后,一般扫码枪是有标识符结束的,一般是键盘上的
 *    keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==KeyEvent.ACTION_DOWN
 *    返回当前扫码内容
 * 4、最后会有KeyEvent.KEYCODE_DPAD_DOWN,到其他view上去
 * 5、还没能解决如何设置timeout问题,让接口提示扫码失败
 */
public class Scanner {

    private Activity activity;

    public Scanner(Activity activity){
        this.activity = activity;
    }

    /**
     * 显示的/隐藏的 EditText 获得光标,准备扫码
     * */
    public void scan(final EditText editText){
        //获得光标
        editText.setFocusable(true);
        editText.setFocusableInTouchMode(true);
        editText.requestFocus();

        //关闭软键盘:防止顺序乱码
        InputMethodManager manager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        //View focus = act.getCurrentFocus();
        manager.hideSoftInputFromWindow(
                //focus == null ? null : focus.getWindowToken(),
                editText == null ? null : editText.getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);

        //增加软键盘监听,扫出来内容会自己填充到editText中去的
        editText.setOnKeyListener(new View.OnKeyListener() {
            //on scan finish , last 3 KeyEvent log
            //keycode=66,event.getAction()=0  -> 66=KeyEvent.KEYCODE_ENTER=换行 , 1=KeyEvent.ACTION_DOWN=按下
            //keycode=66,event.getAction()=1  -> 66=KeyEvent.KEYCODE_ENTER=换行 , 1=KeyEvent.ACTION_UP=抬起
            //keycode=20,event.getAction()=0  -> 20=KeyEvent.KEYCODE_DPAD_DOWN=按键按下 , 1=KeyEvent.ACTION_DOWN=按下
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                //LogUtil.i("keycode="+keyCode+",event.getAction()="+event.getAction());
                if(keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==KeyEvent.ACTION_DOWN){
                    onScanResultCallBack.OnScanSucccess(editText.getText().toString());//返回结果值,看需要使用了
                    return true;
                }
                return false;
            }
        });


    }


    /**
     * 扫码枪接口:有timeout设置,当然光标移除的时候关闭计时
     * 成功 返回扫码结果
     * 失败 返回错误信息
     * */
    public interface OnScanResultCallBack{
        public void OnScanSucccess(String result);
        public void OnScanFail(String errorMsg);
    }


    private OnScanResultCallBack onScanResultCallBack = new OnScanResultCallBack(){
        @Override
        public void OnScanSucccess(String result) {}
        @Override
        public void OnScanFail(String errorMsg) {}
    };

    /**
     * 子类实现回调函数
     * */
    public void setOnScanResultCallBack(Scanner.OnScanResultCallBack onScanResultCallBack) {
        if (onScanResultCallBack == null) throw new IllegalArgumentException("empty onScanResultCallBack");
        this.onScanResultCallBack = onScanResultCallBack;
    }

}
对实际业务其实根本不用扫出来的结果,结果是个url,需要访问后获得infobean才是最后有效的信息,这个业务可以用个0dp的EditText当做容器,扫出结果后返回到callback里,然后后续就xxx。

大家有好的方法做timeout么,是EditText获得光标后开始计时?万一客户就是不扫描呢?不用EditText行不行,随时随地可以扫描?
怎么搞啊!!没思路,蛋疼!!广大码友,有推荐的解决方案可以贴出来。
 ̄へ ̄

目录
相关文章
|
7月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
166 0
|
Android开发
Android Http 请求封装及使用
Android Http 请求封装及使用
243 0
|
7月前
|
XML 监控 Android开发
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
Android Studio App开发入门之文本输入EditText的讲解及使用(附源码 包括编辑框、焦点变更监听器、文本变化监听器 )
343 0
|
7月前
|
Android开发
Android 分享机顶盒项目的封装类《GridView》(二)(转)
Android 分享机顶盒项目的封装类《GridView》(二)(转)
50 2
|
5月前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
45 2
|
4月前
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
49 0
|
4月前
|
编解码 API 开发工具
Android平台轻量级RTSP服务模块二次封装版调用说明
本文介绍了Android平台上轻量级RTSP服务模块的二次封装实践,旨在简化开发流程,让开发者能更专注于业务逻辑。通过`LibPublisherWrapper`类提供的API,可在应用中轻松初始化RTSP服务、配置视频参数(如分辨率、编码类型)、启动与停止RTSP服务及流发布,并获取RTSP会话数量。此外,还展示了如何处理音频和视频数据的采集与推送。最后,文章提供了从启动服务到销毁资源的完整示例,帮助开发者快速集成实时流媒体功能。
|
5月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
6月前
|
Android开发
技术经验分享:Android前后台切换的监听
技术经验分享:Android前后台切换的监听
119 2
|
6月前
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
90 2