安卓蓝牙设备在后台不作为键盘

时间:2015-12-14 16:02:26

标签: java android sockets bluetooth

我有条码扫描程序谁应该使用我的应用程序。它应该在后台运行,我的应用程序以自己的方式响应来自扫描仪的输入。但是,它不应该用作硬件键盘,并且它的输入不是指向第一响应者(即没有文本条目)。目前我坚持使用它,虽然我知道我已经完成了之前描述的解决方案(几年前为一家公司)。

问题的第一部分现在是如何防止蓝牙设备作为硬件键盘连接?我可以控制这种行为,或者它可能是蓝牙设备必须支持的某种模式或设置(如果是,是否有名称可以检查规格)?

我想如果设备没有作为蓝牙键盘连接,我可以建立连接并听蓝牙套接字输入流获取可用字节并收集它们。目前我无法建立连接,因为

UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
socket = device.createRfcommSocketToServiceRecord(uuid);
socket.connect();

抛出java.io.IOException消息read failed, socket might closed or timeout, read ret: -1。虽然设备目前与我的设备配对,但我无法连接到套接字的任何想法?

编辑: 因为有人问过,完整的连接源代码

private void initBluetooth() {
    BTAdapter = BluetoothAdapter.getDefaultAdapter();
    if (BTAdapter == null) {
        Log.e(getClass().getName(), "no BT Adapter");
        return;
    }

    if (!BTAdapter.isEnabled()) {
        Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBT, REQUEST_BLUETOOTH);
        return;
    }

    listDevices();
}
private void listDevices() {
    Set<BluetoothDevice> pairedDevices = BTAdapter.getBondedDevices();
    if (pairedDevices.size() > 0) {
        for (BluetoothDevice device : pairedDevices) {
            Log.d(getClass().getName(), String.format("Device found %s", device.getName()));
            if(device.getName().indexOf("Barcode") > 0) {
                mmDevice = device;
                try {
                    openBT();
                } catch(IOException e) {
                    Log.e(getClass().getName(), "Failed", e);
                }
                break;
            }
        }
    }
}

void openBT() throws IOException
{
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
    //now make the socket connection in separate thread
    Thread connectionThread  = new Thread(new Runnable() {

        @Override
        public void run() {
            // Always cancel discovery because it will slow down a connection
            BTAdapter.cancelDiscovery();

            // Make a connection to the BluetoothSocket
            try {
                // This is a blocking call and will only return on a
                // successful connection or an exception
                mmSocket.connect();
            } catch (IOException e) {
                //connection to device failed so close the socket
                e.printStackTrace();
                try {
                    mmSocket.close();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
        }
    });

    connectionThread.start();

    mmInputStream = mmSocket.getInputStream();
}

0 个答案:

没有答案