【问题标题】:zebra scanner integration in androidandroid中的斑马扫描仪集成
【发布时间】:2018-01-24 17:31:25
【问题描述】:

我们正在使用符号 ls4278 蓝牙扫描仪集成到 android 应用程序中。它作为键盘连接并在任何编辑文本字段中输入扫描的条形码...... 扫描仪 OnKeyUp 事件被调用后。

 public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
        {
        ..
    }

我正在搜索文档和 android sdk,但找不到这样的。但是对于 LI4278,他们在这里有 android sdk:https://www.zebra.com/us/en/support-downloads/scanners/general-purpose-scanners/li4278.html 这里也是 sdk 的文档,但 LS4278 不在支持的设备列表中。

有人在安卓设备中实现了 LS4278 扫描仪吗?

【问题讨论】:

    标签: android xamarin.android barcode-scanner android-bluetooth


    【解决方案1】:

    如果它用作蓝牙键盘,则不需要支持。只需捕获关键事件,并在按下回车时对数据做出反应。它只是一种平庸的体验,可以与屏幕键盘混淆并阻止他们使用实际的蓝牙键盘。如果扫描仪支持 SPP,您可以通过蓝牙串口轻松解析出扫描数据(大约 2 周前我这样做了)。

    【讨论】:

    • 用户不想按回车键,扫描仪本身不会按任何其他按钮,需要条形码数字...关于 SPP 我不知道,这里没有关于此的文档(或者我找不到).. 所以,我需要以某种方式测试
    • 扫描仪本身将回车键作为条形码的最后一个字符发送。所以你可以捕捉到它。这是 onKeyUp 实际适用的少数情况之一。至于 SPP-我会为此发布第二个答案,实际上我几周前就自己做了。
    【解决方案2】:

    LS4278 产品页面位于此处:https://www.zebra.com/us/en/support-downloads/scanners/general-purpose-scanners/ls4278.html,并仅列出了对“Windows 扫描仪 SDK”的支持。 LS4278 于 2012 年 9 月 24 日停产,所以我并不惊讶它不支持 Android。正如您所说,它的继任者 LI4278 确实支持 Android。正如其他答案所述,如果您想更好地控制接收数据的方式,那么如果扫描仪支持,我建议您尝试 SPP。

    【讨论】:

      【解决方案3】:
          BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter();
          if(bta != null) {
              Set<BluetoothDevice> devices = bta.getBondedDevices();
              for (final BluetoothDevice device : devices) {
                  BluetoothClass btClass = device.getBluetoothClass();
                  if (btClass.getMajorDeviceClass() == 0x1f00) {
                      //Only look at devices which are considered uncategorized, so we don't screw up any bt headset, leyboard, mouse, etc
                      new DeviceThread(device).start();
                  }
              }
              IntentFilter filter = new IntentFilter();
              filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
              registerReceiver(new BroadcastReceiver() {
                  @Override
                  public void onReceive(Context context, Intent intent) {
                      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                      int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);
                      if (state == BluetoothDevice.BOND_BONDED) {
                          new DeviceThread(device).start();
                      } else if (state == BluetoothDevice.BOND_NONE) {
                          DeviceThread thread = threadMap.get(device.getAddress());
                          if (thread != null) {
                              thread.interrupt();
                          }
                      }
                  }
              }, filter);
          }
      
      
      private class DeviceThread extends Thread {
          private BluetoothDevice device;
      
          public DeviceThread(BluetoothDevice device) {
              this.device = device;
              threadMap.put(device.getAddress(), this);
          }
      
          @Override
          public void run() {
              try {
                  BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                  socket.connect();
                  InputStream inputStream = socket.getInputStream();
      
                  while (!Thread.interrupted() && socket.isConnected()) {
                      inputStream.skip(5);
                      String data = "";
                      do {
                          int code = inputStream.read();
                          char character = (char) code;
                          data = data + character;
                      } while (inputStream.available() > 0);
                      data = data.substring(0, data.length() - 2);
      
                      if (scannerEventListener != null) {
      
                          scannerEventListener.onScan(data);
                      }
                  }
              } catch (IOException ex) {
                  ex.printStackTrace();
              }
              Log.d("GABE", "Exiting thread");
          }
      }
      

      此代码将注册正在配对的蓝牙设备,然后检查它们是否为未知设备类型(扫描仪没有设备类)。如果是这样,它将启动一个线程来侦听该设备。当它未绑定时,它将中断该线程。在线程上,它打开到设备的 SPP 连接并等待输入。当它得到它时,它会解析输入并将结果发送给监听器。

      为此,扫描仪需要处于 SPP 模式。有些扫描仪支持它,有些不支持,如何将其设置为该模式各不相同(我桌上的那个有一个控制条形码,我需要扫描以设置模式)。一般来说,我会对其进行编码以接受任一类型的输入——硬件键盘模式或 SPP。

      【讨论】:

        猜你喜欢
        • 2019-12-10
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        相关资源
        最近更新 更多