BluetoothSocket.connect () генерирует IOException, когда приложение работает в фоновом потоке - PullRequest
1 голос
/ 29 мая 2019

Я работаю над приложением Bluetooth, в котором я пытаюсь подключить одно из устройств Bluetooth (сопряженных), которые были отсканированы с помощью адаптера Bluetooth. Я пытаюсь подключить BluetoothSocket.connect () в потоке фоновой службы, но он выдает IOException: «ошибка чтения, сокет может быть закрыт или истекло время ожидания, чтение ret: -1» каждый раз.

Я имею в виду Android Образец кода BluetoothChat GitHub Пример кода. В проекте BluetoothChat BluetoothSocket.connect () работает правильно, когда приложение находится на переднем плане, но когда приложение на заднем плане, оно выдает мне то же исключение.

BluetoothDevice btDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address); //address = "98:0C:A5:CF:34:8B"
connect(btDevice, true);
    public synchronized void connect(BluetoothDevice device, boolean secure) {
        // Cancel any thread
        if (connectThread != null) {
            connectThread.cancel();
            connectThread = null;
        }

        // Start the thread to connect with the given device
        connectThread = new ConnectThread(device, secure);
        connectThread.start();
    }
 // Unique UUID for this application
    private static final UUID MY_UUID_SECURE =
            UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
    private static final UUID MY_UUID_INSECURE =
            UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");

    // runs while attempting to make an outgoing connection
    private class ConnectThread extends Thread {
        private final BluetoothSocket socket;
        private String socketType;

        private ConnectThread(BluetoothDevice device, boolean secure) {
            BluetoothSocket tmp = null;
            socketType = secure ? "Secure" : "Insecure";
            try {
                if (secure) {
                    tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE,
                            MY_UUID_SECURE);
                } else {
                    tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(
                            NAME_INSECURE, MY_UUID_INSECURE);
                }
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(BluetoothWebSocket.class.getSimpleName(), "bt connect: " + e.getMessage());
            }
            socket = tmp;
        }

        public void run() {
            setName("ConnectThread" + socketType);

            // Always cancel discovery because it will slow down a connection
            BluetoothAdapter.getDefaultAdapter().cancelDiscovery();

            // Make a connection to the BluetoothSocket
            try {
                socket.connect();
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(BluetoothWebSocket.class.getSimpleName(), "bt connection error: " + e.getMessage());
                try {
                    socket.close();
                } catch (IOException e2) {
                    Log.e(BluetoothWebSocket.class.getSimpleName(), "bt connection IO error: " + e2.getMessage());
                }
                btConnectResult = "{\"bt_connection_result\":\"failed\"}"; //scanned result failed
                return;
            }
            btConnectResult = "{\"bt_connection_result\":\"success\"}"; //scanned result success
        }

        boolean cancel() {
            try {
                socket.close();
                return true;
            } catch (IOException e) {
                Log.e(BluetoothWebSocket.class.getSimpleName(), "bt connection cancel error: " + e.getMessage());
                return false;
            }
        }

    }

Если у кого-то есть идеи, как решить эту проблему, пожалуйста, поделитесь. ТИА.

...