android 中的斑马扫描仪集成
zebra scanner integration in android
我们正在使用符号 ls4278 蓝牙扫描仪集成到 android 应用程序中。它作为键盘连接并在任何编辑文本字段中键入扫描的条形码...
调用扫描仪 OnKeyUp 事件后。
public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
{
..
}
我正在搜索文档和 android sdk,但找不到这样的。但是对于 LI4278,他们在这里有 android sdk:https://www.zebra.com/us/en/support-downloads/scanners/general-purpose-scanners/li4278.html
这里还有 sdk 的文档,但 LS4278 不在支持的设备列表中。
是否有人在 android 设备中实施了 LS4278 扫描仪?
如果它作为蓝牙键盘使用,则不需要支持。只需捕获关键事件,并在按下回车键时对数据做出反应。这只是一种平庸的体验,可能会弄乱屏幕键盘并阻止他们使用实际的蓝牙键盘。如果扫描仪支持 SPP,您可以通过蓝牙串口轻松解析扫描数据(我大约 2 周前这样做了)。
LS4278 产品页面位于:https://www.zebra.com/us/en/support-downloads/scanners/general-purpose-scanners/ls4278.html 并列出了仅对 "Windows Scanner SDK" 的支持。 LS4278 已于 2012 年 9 月 24 日停产,因此我对它没有 Android 支持并不感到惊讶。正如您所说,它的继任者 LI4278 确实具有 Android 支持。正如另一个答案所述,如果您想更好地控制接收数据的方式,那么我建议在扫描仪支持的情况下尝试使用 SPP。
BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter();
if(bta != null) {
Set<BluetoothDevice> devices = bta.getBondedDevices();
for (final BluetoothDevice device : devices) {
BluetoothClass btClass = device.getBluetoothClass();
if (btClass.getMajorDeviceClass() == 0x1f00) {
//Only look at devices which are considered uncategorized, so we don't screw up any bt headset, leyboard, mouse, etc
new DeviceThread(device).start();
}
}
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);
if (state == BluetoothDevice.BOND_BONDED) {
new DeviceThread(device).start();
} else if (state == BluetoothDevice.BOND_NONE) {
DeviceThread thread = threadMap.get(device.getAddress());
if (thread != null) {
thread.interrupt();
}
}
}
}, filter);
}
private class DeviceThread extends Thread {
private BluetoothDevice device;
public DeviceThread(BluetoothDevice device) {
this.device = device;
threadMap.put(device.getAddress(), this);
}
@Override
public void run() {
try {
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket.connect();
InputStream inputStream = socket.getInputStream();
while (!Thread.interrupted() && socket.isConnected()) {
inputStream.skip(5);
String data = "";
do {
int code = inputStream.read();
char character = (char) code;
data = data + character;
} while (inputStream.available() > 0);
data = data.substring(0, data.length() - 2);
if (scannerEventListener != null) {
scannerEventListener.onScan(data);
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
Log.d("GABE", "Exiting thread");
}
}
此代码将注册正在配对的蓝牙设备,然后检查它们是否为未知设备类型(扫描仪没有设备 class)。如果是这样,它将启动一个线程来侦听该设备。当它解除绑定时,它将中断该线程。在线程上,它打开到设备的 SPP 连接并等待输入。当它得到它时,它会解析输入并将结果发送给侦听器。
为此,扫描仪需要处于 SPP 模式才能正常工作。有些扫描仪支持它,有些不支持,如何将其设置为该模式各不相同(我桌上的那个有一个控制条码,我需要扫描它才能设置模式)。通常,我会为其编写代码以接受任何一种输入类型——硬件键盘模式或 SPP。
我们正在使用符号 ls4278 蓝牙扫描仪集成到 android 应用程序中。它作为键盘连接并在任何编辑文本字段中键入扫描的条形码... 调用扫描仪 OnKeyUp 事件后。
public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
{
..
}
我正在搜索文档和 android sdk,但找不到这样的。但是对于 LI4278,他们在这里有 android sdk:https://www.zebra.com/us/en/support-downloads/scanners/general-purpose-scanners/li4278.html 这里还有 sdk 的文档,但 LS4278 不在支持的设备列表中。
是否有人在 android 设备中实施了 LS4278 扫描仪?
如果它作为蓝牙键盘使用,则不需要支持。只需捕获关键事件,并在按下回车键时对数据做出反应。这只是一种平庸的体验,可能会弄乱屏幕键盘并阻止他们使用实际的蓝牙键盘。如果扫描仪支持 SPP,您可以通过蓝牙串口轻松解析扫描数据(我大约 2 周前这样做了)。
LS4278 产品页面位于:https://www.zebra.com/us/en/support-downloads/scanners/general-purpose-scanners/ls4278.html 并列出了仅对 "Windows Scanner SDK" 的支持。 LS4278 已于 2012 年 9 月 24 日停产,因此我对它没有 Android 支持并不感到惊讶。正如您所说,它的继任者 LI4278 确实具有 Android 支持。正如另一个答案所述,如果您想更好地控制接收数据的方式,那么我建议在扫描仪支持的情况下尝试使用 SPP。
BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter();
if(bta != null) {
Set<BluetoothDevice> devices = bta.getBondedDevices();
for (final BluetoothDevice device : devices) {
BluetoothClass btClass = device.getBluetoothClass();
if (btClass.getMajorDeviceClass() == 0x1f00) {
//Only look at devices which are considered uncategorized, so we don't screw up any bt headset, leyboard, mouse, etc
new DeviceThread(device).start();
}
}
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);
if (state == BluetoothDevice.BOND_BONDED) {
new DeviceThread(device).start();
} else if (state == BluetoothDevice.BOND_NONE) {
DeviceThread thread = threadMap.get(device.getAddress());
if (thread != null) {
thread.interrupt();
}
}
}
}, filter);
}
private class DeviceThread extends Thread {
private BluetoothDevice device;
public DeviceThread(BluetoothDevice device) {
this.device = device;
threadMap.put(device.getAddress(), this);
}
@Override
public void run() {
try {
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket.connect();
InputStream inputStream = socket.getInputStream();
while (!Thread.interrupted() && socket.isConnected()) {
inputStream.skip(5);
String data = "";
do {
int code = inputStream.read();
char character = (char) code;
data = data + character;
} while (inputStream.available() > 0);
data = data.substring(0, data.length() - 2);
if (scannerEventListener != null) {
scannerEventListener.onScan(data);
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
Log.d("GABE", "Exiting thread");
}
}
此代码将注册正在配对的蓝牙设备,然后检查它们是否为未知设备类型(扫描仪没有设备 class)。如果是这样,它将启动一个线程来侦听该设备。当它解除绑定时,它将中断该线程。在线程上,它打开到设备的 SPP 连接并等待输入。当它得到它时,它会解析输入并将结果发送给侦听器。
为此,扫描仪需要处于 SPP 模式才能正常工作。有些扫描仪支持它,有些不支持,如何将其设置为该模式各不相同(我桌上的那个有一个控制条码,我需要扫描它才能设置模式)。通常,我会为其编写代码以接受任何一种输入类型——硬件键盘模式或 SPP。