android获取没有edittext的条形码扫描器输入

时间:2016-07-22 16:17:01

标签: android barcode-scanner

我有一个物理条码扫描器,我希望在没有专注map的情况下在应用程序中输入它,即条形码。

我尝试在EditText中添加KeyListener。但是,没有调用其实现的方法(ActivityonKeyUp等)。

然后我添加了onKeyDown,它有效,但从未被调用过多次条码长度。相反,在读取条形码之前,我视图中的一些随机dispatchKeyEvent会从条形码扫描仪中获得焦点。

button

我在SO中看到了一些问题,但没有一个真正给出了具体答案。

6 个答案:

答案 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)
}