android获取条形码扫描仪输入,无需编辑文本
我有一个物理条形码扫描仪,我想在应用程序中获取它的输入,即条形码,而不需要聚焦的android获取条形码扫描仪输入,无需编辑文本,android,barcode-scanner,Android,Barcode Scanner,我有一个物理条形码扫描仪,我想在应用程序中获取它的输入,即条形码,而不需要聚焦的编辑文本 我尝试在我的活动中添加一个keylister。但是,没有调用它的任何实现方法(onKeyUp,onKeyDown等) 然后,我添加了dispatchKeyEvent,虽然有效,但调用的次数从来没有条形码长度那么多。相反,在读取条形码之前,我视图中的一些随机按钮从条形码扫描仪获得焦点 String barcode = ""; @Override public boolean dispatchKeyEvent
编辑文本
我尝试在我的活动中添加一个keylister
。但是,没有调用它的任何实现方法(onKeyUp
,onKeyDown
等)
然后,我添加了dispatchKeyEvent
,虽然有效,但调用的次数从来没有条形码长度那么多。相反,在读取条形码之前,我视图中的一些随机按钮从条形码扫描仪获得焦点
String barcode = "";
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
char pressedKey = (char) e.getUnicodeChar();
barcode += pressedKey;
if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
Toast.makeText(getApplicationContext(), "barcode--->>>" + barcode, Toast.LENGTH_LONG)
.show();
}
return super.dispatchKeyEvent(e);
}
我在SO中看到了一些问题,但没有一个真正给出具体的答案。e.getCharacters()应该提供完整的条形码。
这在PL-40L设备上运行,该设备带有嵌入式2d条形码阅读器,运行Android 5.1
dispatchKeyEvent(KeyEvent e)针对每个读取的条形码触发一次,而不是针对条形码中的每个字符
希望这有帮助DispatchKeyEvent硬件密钥事件始终传递到当前关注的视图。它们从视图层次结构的顶部开始调度,然后向下调度,直到到达相应的目标。如果您的视图(或视图的子视图)当前具有焦点,则可以通过dispatchKeyEvent()方法查看事件旅行。简而言之,dispatchKeyEvent()仅在TextView/EditText处于焦点时才会被调用。对于我来说,对于条形码扫描仪(USB,参考STA PC
)工作的下一个代码:
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if(e.getAction()==KeyEvent.ACTION_DOWN){
Log.i(TAG,"dispatchKeyEvent: "+e.toString());
char pressedKey = (char) e.getUnicodeChar();
barcode += pressedKey;
}
if (e.getAction()==KeyEvent.ACTION_DOWN && e.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
Toast.makeText(getApplicationContext(),
"barcode--->>>" + barcode, Toast.LENGTH_LONG)
.show();
barcode="";
}
return super.dispatchKeyEvent(e);
}
首先,谢谢大家。
由于我的应用程序必须在数据库中查找条形码,因此我没有将ENTER_键输入添加到条形码字符串中,同时为了防止任何聚焦按钮熄灭,我使该方法返回false
String barcode = "";
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if(e.getAction()==KeyEvent.ACTION_DOWN
&& e.getKeyCode() != KeyEvent.KEYCODE_ENTER){ //Not Adding ENTER_KEY to barcode String
char pressedKey = (char) e.getUnicodeChar();
barcode += pressedKey;
}
if (e.getAction()==KeyEvent.ACTION_DOWN
&& e.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
Log.i(TAG,"Barcode Read: "+barcode);
barcodeLookup(barcode);// or Any method handling the data
barcode="";
}
return false;
}
即使没有任何聚焦视图,您也可以这样做。您需要订阅以下广播目的:
const val QR_ACTION: String = "android.intent.ACTION_DECODE_DATA"
const val QR_EXTRA: String = "barcode_string"
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
try {
Timber.d("Get intent ${intent.action}")
if (QR_ACTION == intent.action) {
if (intent.hasExtra(QR_EXTRA)) {
val code = intent.getStringExtra(QR_EXTRA)
Timber.d("New QR code $code")
// now you have qr code here
}
} }
} catch (t: Throwable) {
// handle errors
}
}
}
请先检查扫描仪设置中的QR_操作和QR_额外设置,不同品牌的设置可能不同。使用kotlin
private val barcode = StringBuffer()
override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
if (event?.action == KeyEvent.ACTION_DOWN) {
val pressedKey = event.unicodeChar.toChar()
barcode.append(pressedKey)
}
if (event?.action == KeyEvent.ACTION_DOWN && event?.keyCode == KeyEvent.KEYCODE_ENTER) {
Toast.makeText(baseContext, barcode.toString(), Toast.LENGTH_SHORT).show()
barcode.delete(0, barcode.length)
}
return super.dispatchKeyEvent(event)
}
我认为要真正解决这个问题,你需要一些条形码扫描器的文档——它到底应该向你的应用程序发送什么?它是模拟键盘(通常要做的事情),还是其他什么?设备文档中的任何其他提示?搜索了文档,但没有找到任何提示。我确实用EditText
对其进行了测试,我唯一的结论是,在逐个发送条形码编号后,它会发出ENTER
Hello。我有一个平板电脑应用程序和一个物理条形码扫描仪,但当平板电脑通过usb连接到电脑时,扫描仪无法正常工作。有什么建议吗?