Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android获取条形码扫描仪输入,无需编辑文本_Android_Barcode Scanner - Fatal编程技术网

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连接到电脑时,扫描仪无法正常工作。有什么建议吗?