Android 通过 USB 连接扫描枪 获得扫描信息
通常,扫描枪支持 USB 连接或者蓝牙连接,这里只介绍 USB 连接方式,想了解蓝牙方式可以参考这篇文章:https://blog.csdn.net/czhpxl007/article/details/50363766
实现思路:扫描枪扫码的操作其实就相当于用键盘一次性输入一串字符,结束符就是回车键,因此,可以通过监听键盘输入来获得扫描内容。
步骤一:创建扫码枪事件解析类 ScanGunKeyEventHelper
public class MainActivity extends AppCompatActivity {
public static String scannerStr = ""; //储存最近一次扫描枪扫描的内容
ScanGunKeyEventHelper mScanGunKeyEventHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
mScanGunKeyEventHelper = new ScanGunKeyEventHelper();
......
}
/**
* Activity 截获按键事件.发给 ScanGunKeyEventHelper
* @param event
* @return
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
mScanGunKeyEventHelper.analysisKeyEvent(event);
return true;
}
}
步骤二:在需要使用扫描枪的 Activity 中监听键盘事件,使用 ScanGunKeyEventHelper 获得扫描枪的内容
public class MainActivity extends AppCompatActivity {
public static String scannerStr = ""; //储存最近一次扫描枪扫描的内容
ScanGunKeyEventHelper mScanGunKeyEventHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
mScanGunKeyEventHelper = new ScanGunKeyEventHelper();
......
}
/**
* Activity 截获按键事件.发给 ScanGunKeyEventHelper
* @param event
* @return
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
mScanGunKeyEventHelper.analysisKeyEvent(event);
return true;
}
}
可能出现的问题:重新接入或断开扫描枪时,页面重新加载导致数据丢失或有额外线程同时运行等问题
分析:扫描枪作为 Android 的外接设备,功能上来说就相当于外接键盘,而当 Android 的配置发生变化时(屏幕旋转、键盘接入或断开等等),Android 会重启正在运行的 Activity(先后调用 onDestroy() 和 onCreate())。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。因此,我们只要告诉 Android 不需要在键盘状态变化时重启 Activity 即可。
解决方法:在 app/manifests/AndroidManifest.xml 中找到当前 Activity ,添加一下内容即可 :
android:configChanges="orientation|keyboard"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--其他 Activity 注册信息-->
......
</manifest>
------------------------------------------------------------------------------------------------------------------------
参考资料:
https://blog.csdn.net/czhpxl007/article/details/50363766
https://developer.android.com/guide/topics/resources/runtime-changes?hl=zh-cn