Android 扫码枪监听封装

一、参考

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行不行,随时随地可以扫描?
怎么搞啊!!没思路,蛋疼!!广大码友,有推荐的解决方案可以贴出来。
 ̄へ ̄

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容