Android获取外部扫描设备的数据

在软件开发过程中,除去单纯的应用APP,很多时候都需要和部分硬件打交道。比如扫码枪扫码、刷卡器刷卡等;这次项目开发中其中一个就是需要拿到刷卡器的返回数据。

刷卡器的数据返回格式

很多扫码枪或者刷卡器,其实就是把读取到的数据在有游标(有焦点、可输入)的地方打印出来;就像在电脑中新建一个文档打开,然后把读卡器连到电脑上,一刷卡,就能在文档中自动打印出读到的数据。因此,想要拿到刷卡器的数据可以说是很简单了。

Android中的实现

既然刷卡器可以把数据输入到一个有焦点、可输入的地方,那么在Android中,适合接受数据的就是EditText了。只要我们在界面中放置一个输入框,那么每次在刷卡器读到数据后,就直接能从输入框中获取数据了。但是有些地方还是得注意。

让文本框获取到焦点

读卡器的数据是可以输出到能输入、有焦点的地方,因此,界面添加了EditText之后还需要让这个文本框获取到焦点,否则数据也没法输出到这个文本框中,我们也就没办法拿到数据了。所以在界面初始化完成之后,需要手动的将焦点转移到EditText上。

//获取焦点三步曲...
mEtCard.setFocusable(true);
mEtCard.setFocusableInTouchMode(true);
mEtCard.requestFocus();
让文本框藏起来

读卡器的数据是直接输出到文本框中的,但我们总不能把文本框直接展示在界面中吧。因为这样,每次读取到数据就直接展示在了界面中,那不是让用户很困惑…

那也很简单,直接把文本框隐藏了如何?这样就不会让用户再看到有什么莫名其妙的内容显示在界面中了。但这样也就把文本框获取焦点的能力给剥夺了,因为它都不显示了,那还怎么去获取焦点呢?因此使用View.INVISIBLEView.GONE是行不通的。既然让文本框隐藏没法实现,那如果让它透明呢?虽然说从代码的角度来说,这个文本框还是显示在了界面中,但是用户看不到啊;因此使用View.setAlpha(0)来让文本框透明,就算输入再多数据,只要看不到,那就不会影响到用户的使用。

让软键盘也藏起来

把文本框透明了,这样用户就看不到界面上有接收数据的文本框了。但当我们刷了一下卡后,发现软键盘出来了…这时才想到,数据是直接在能输入、有焦点的地方输出的,说不定就是利用系统键盘打出来的呢?此时就产生了新的需求:需要在输入时(也就是在接收读卡器数据时)不让软键盘弹出来。 看了下系统提供的方法,有个setShowSoftInputOnFocus(boolean show)方法,这是TextView提供的方法,EditText继承于TextView,按说也是能够使用的。但是在我的测试环境下,使用这个方法并不能阻止软键盘的弹出。之后辗转,找到了另一个方式,就是通过设置EditText的InputType来达到目的。

//设置输入框获取焦点时软键盘不弹出
mEtCard.setShowSoftInputOnFocus(false); //还是加上了这个方法...
mEtCard.setInputType(InputType.TYPE_NULL);
让文本框无处不在

既然文本框可以在用户无感的状态下拿到读卡器的数据,那现在再直接把EditText放在界面中就可以了。但试想一下,当我们在主界面放置好接收数据的文本框后,只要在主界面我们都能接收到来自读卡器的数据;那要是跳转到其他界面呢,这个时候主界面就没法再获取到焦点了,也就是此时应用是无法获接收读卡器数据的。那也很简单,直接在新的界面中也加上透明的EditText,这样就可以接收数据了。

很显然,这样问题就出现了:我们不能在每个界面都加上一个透明的文本框,然后在每个界面都进行对应的数据处理。 当然如果你说就只有主界面需要接收数据,那么这种处理方式当然也可以接受。除此之外 ,我们就需要有一个全局的EditText来随时接收来自读卡器的数据并进行处理。 具体做法也就是创建一个全局View来实现,可参考之前的文章 - Android添加应用全局View。在这里,我们就只需要在全局的View中添加一个EditText即可。

读卡器数据的获取

之前也说过,这种读卡器的数据很好获取,就是直接把输出到EditText中的文本拿到就行。一般这种输出都会用特定的字符来进行结尾(比如换行符),这样我们就可以在监听到输入换行符时读取到此次输出的数据。要注意的是 - 每次拿到数据后要把文本框内容清空,否则之前输出的数据内容就会一直存在那,之后拿到的数据就不正确了。 Android中监听按键的功能代码:

mEtCard.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_SEND
                        || actionId == EditorInfo.IME_ACTION_DONE
                        || (event != null && KeyEvent.KEYCODE_ENTER == event.getKeyCode() && KeyEvent.ACTION_DOWN == event.getAction())) {
                        
                    ...  //处理事件
                    mEtCard.setText(""); //重置输入框内容
                }
                return true;
            }
        });

以上,就能让应用获取到读卡器的输出数据了。最后需要注意的是,因为界面中一直有个获取焦点的EditText,但是我们不能保证整个应用都没有其他地方需要文本输入的时候。因此在有需要用户手动输入的时候,需要把那个全局View移除或者隐藏,之后再显示出来。

当然,如果要求在有其他输入框的地方,也需要能够接受这种读卡器的数据,那么只能说,换种读卡器吧。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值