android 扫描枪封装,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行不行,随时随地可以扫描?

怎么搞啊!!没思路,蛋疼!!广大码友,有推荐的解决方案可以贴出来。

 ̄へ ̄

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android设备上获取扫描扫描的值,你需要进行以下步骤: 1. 确保你的Android设备与建立连接。这可以通过蓝牙或USB接口完成,具体取决于你所使用的型号。 2. 在你的Android应用程序中,创建一个监听器来接收扫描扫描事件。 3. 通过监听器获取扫描发送的扫描值。这些值通常以字符串的形式传递。 4. 处理扫描值以满足你的应用需求。你可以将它们显示在界面上,存储到数据库中或进行其他操作。 5. 在你不再需要扫描的值时,确保你停止监听扫描事件,以释放资源并节省电池。 下面是一个简单的示例代码,展示了如何在Android应用中获取扫描扫描值: ```java public class MainActivity extends AppCompatActivity { private BarcodeScanner barcodeScanner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); barcodeScanner = new BarcodeScanner(); barcodeScanner.setScanListener(new BarcodeScanner.ScanListener() { @Override public void onScan(String scanValue) { // 处理扫描值 Log.d("Scan Value", scanValue); } }); } @Override protected void onResume() { super.onResume(); // 开始监听扫描事件 barcodeScanner.startScan(); } @Override protected void onPause() { super.onPause(); // 停止监听扫描事件 barcodeScanner.stopScan(); } } ``` 在这个示例中,我们创建了一个`BarcodeScanner`类,它负责与建立连接并处理扫描事件。`ScanListener`接口用于获取并处理扫描值。在`MainActivity`的`onCreate`方法中,我们实例化了`BarcodeScanner`并设置了扫描监听器。在`onResume`方法中开始监听扫描事件,在`onPause`方法中停止监听。 请注意,这只是一个简单的示例,具体的实现可能会因型号和连接方式的不同而有所不同。你可能需要阅读与你的相关的文档,并根据具体要求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值