我有一个物理条码扫描器,我希望在没有专注map
的情况下在应用程序中输入它,即条形码。
我尝试在EditText
中添加KeyListener
。但是,没有调用其实现的方法(Activity
,onKeyUp
等)。
然后我添加了onKeyDown
,它有效,但从未被调用过多次条码长度。相反,在读取条形码之前,我视图中的一些随机dispatchKeyEvent
会从条形码扫描仪中获得焦点。
button
我在SO中看到了一些问题,但没有一个真正给出了具体答案。
答案 0 :(得分:3)
对我来说,对于条形码扫描仪(USB,参考STA pcs
),可以使用下一个代码:
@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);
}
答案 1 :(得分:1)
e.getCharacters()应该为您提供完整的条形码。 这适用于带有嵌入式2d条形码阅读器的PL-40L设备,运行Android 5.1 dispatchKeyEvent(KeyEvent e)为每个读取条形码触发一次,而不是为条形码中的每个字符触发 希望这有帮助
答案 2 :(得分:0)
DispatchKeyEvent 硬件键事件始终传递到当前焦点的视图。它们从View层次结构的顶部开始,然后向下调度,直到它们到达适当的目标。如果您的View(或您的View的子级)当前具有焦点,那么您可以通过dispatchKeyEvent()方法查看事件。简而言之,只有在TextView / EditText处于焦点时才会调用dispatchKeyEvent()。
答案 3 :(得分:0)
首先,谢谢大家。 由于我的应用程序必须在数据库中查找条形码,因此不必将ENTER_KEY输入添加到条形码字符串中,也为了防止任何集中的按钮熄灭,我使Method返回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;
}
答案 4 :(得分:0)
即使没有任何集中视图,您也可以执行此操作。您需要这样订阅广播意图:
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_ACTION和QR_EXTRA,不同品牌的QR_ACTION和QR_EXTRA可能不同。
答案 5 :(得分:0)
使用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)
}