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