【问题标题】:android get barcode scanner input without edittextandroid在没有edittext的情况下获取条形码扫描仪输入
【发布时间】:2016-07-22 16:17:01
【问题描述】:

我有一个物理条码扫描仪,我想在应用程序中获取它的输入,即条码,而无需关注EditText

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

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

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 中看到了一些问题,但没有一个真正给出具体答案。

【问题讨论】:

  • 我认为要真正解决这个问题,您需要来自条形码扫描仪的一些文档 - 它到底应该发送到您的应用程序什么?它是模拟键盘(通常要做的事情)还是其他什么?设备文档中还有其他提示吗?
  • 搜索了文档但没有找到任何东西。我确实用EditText 对其进行了测试,我唯一的结论是,在一个接一个发送条形码编号后,它会发出一个ENTER
  • @XeniaSis hai....你是怎么解决这个问题的。我尝试了以下解决方案。但是当我调用一个以条形码为参数的 api 时,只发送第一个字符,因此会出错。
  • @Android_id 抱歉,多年未从事安卓开发工作

标签: android barcode-scanner


【解决方案1】:

对我来说,条形码扫描仪(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);
}

【讨论】:

  • 你好。我有一个平板电脑应用程序和一个物理条形码扫描仪,但是当平板电脑通过 USB 连接到电脑时,扫描仪无法正常工作。有什么建议吗?
【解决方案2】:

首先,谢谢大家。 由于我的应用程序必须在数据库中查找条形码,因此我必须不将 ENTER_KEY 输入添加到条形码字符串中,同时为了防止任何焦点按钮关闭,我使方法返回 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;
}

【讨论】:

    【解决方案3】:

    使用科特林

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

    【讨论】:

      【解决方案4】:

      e.getCharacters() 应该给你完整的条形码。 这适用于我的 PL-40L 设备,带有嵌入式 2d 条码阅读器,运行 Android 5.1 dispatchKeyEvent(KeyEvent e) 对每个读取的条码触发一次,而不是对条码中的每个字符触发一次 希望这会有所帮助

      【讨论】:

        【解决方案5】:

        DispatchKeyEvent 硬件按键事件总是传递给当前焦点所在的视图。它们从 View 层次结构的顶部开始调度,然后向下调度,直到它们到达适当的目的地。如果您的视图(或您的视图的子视图)当前具有焦点,那么您可以通过 dispatchKeyEvent() 方法看到事件的传播。简而言之,dispatchKeyEvent() 只有在 TextView/EditText 处于焦点时才会被调用。

        【讨论】:

          【解决方案6】:

          即使没有任何焦点视图,您也可以做到这一点。您需要像这样订阅广播意图:

          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,不同品牌可能会有所不同。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-01-08
            • 1970-01-01
            • 2019-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多