Android 扫码枪监听封装
一、参考
一、简述
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行不行,随时随地可以扫描?
怎么搞啊!!没思路,蛋疼!!广大码友,有推荐的解决方案可以贴出来。
 ̄へ ̄
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
[安卓] 17、一个简单的例子学安卓侧滑设计——用开源slidingmenu
效果如下: 下面是工程结构: 整个工程包括android-v7、SlidingMenu-lib和主工程SlidingMenuTest部分 其中前两个作为lib,后一个为主工程 主工程包含两个lib工程方法为:(易错点) 选择主工程属性 而主工程包括: 逻辑部分:(SRC)其中MainActivity.java是主入口,在主入口内调用部分函数可加载MainFragment.java所对应的Fragment 而CircleImageView.java主要负责使头像呈圆形用的 显示部分:(layout)activity_main.xml对应主页面,layout_actionbar.xml对应actionbar(actionbar的形式可以通过这个调节), layout_menu.xml是侧栏,item_menu.xml是侧栏中的列表的item(上一节中讲了自定义列表和这个类似) 这里MainActivity协调整体逻辑: 该avtivity中代码比较简洁,一看便知道怎么用fragment的了——17、18 怎么设置侧滑——15 怎么设置bar——16...
- 下一篇
Android获取设备屏幕宽高pix值的两个方法
private void get1() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); int width = dm.widthPixels; int height = dm.heightPixels; Log.d("方法1", width + " , " + height); } private void get2() { WindowManager manager = this.getWindowManager(); DisplayMetrics outMetrics = new DisplayMetrics(); manager.getDefaultDisplay().getMetrics(outMetrics); int width = outMetrics.widthPixels; int height = outMetrics.heightPixels; Log.d("方法2", width + " , " + height); }...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题