Как закрыть все предыдущие разъемы Bluetooth после запуска моего приложения?

В моем приложении я открываю и закрываю разъем Bluetooth на одном и том же устройстве каждый сеанс и прослушиваю данные. Когда я закрываю один, я обязательно закрываю входной и выходной потоки, а затем cancel метод. Тем не менее, для некоторых людей приложение продолжает пытаться читать с устройства. Я знаю, потому что я читаю журналы, которые из run() в потоке прослушивания, где есть флаг для прослушивания, который установлен в false в cancelи поток прослушивания завершится, когда сокет будет закрыт из-за IOException, но этого никогда не происходит, поэтому сокет должен быть открыт. Я вижу журналы попыток чтения каждую секунду каждого дня, даже если человек не использует приложение. Это может быть потому, что приложение вылетает и cancel метод не вызывается. В любом случае я не могу гарантировать, что метод отмены будет вызван. Как закрыть все сокеты Bluetooth, которые были ранее открыты при запуске моего приложения, если все они были открыты в новых потоках, созданных независимо?

У этого парня была та же самая проблема, но я не видел никакого решения: соединение Android Bluetooth не закрывается после сбоя приложения

Принятый ответ не годится, потому что:

  1. Текущие пользователи не имели UncaughtExceptionHandler запустите этот код, и все предыдущие соединения должны быть закрыты при выходе новой версии

  2. UncaughtExceptionHandler должен иметь ссылку на сокеты, которых у него нет. Я хочу иметь возможность закрыть любые разъемы Bluetooth при запуске приложения.

  3. Парень, который задал этот вопрос, спросил, как получить информацию о сокете для хранения, когда приложение запускается, и вы хотите закрыть их, и не получил ответа.

РЕДАКТИРОВАТЬ:

Как открыть сокет (удален лог-код):

        try {
            tmp.connect();;
        } catch (IOException e) {
            isConnected = false;
                try {
                    tmp = (BluetoothSocket) device.getClass().getMethod("createRfcommSocket",
                            new Class[] {int.class}).invoke(device, 1);
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
                try {
                    tmp.connect();
                    setConnected();
                } catch (IOException e1) {
                    e1.printStackTrace();
                    isConnected = false;
                    cancel();
                }

Как закрыть розетку:

    public void cancel() {

        isConnected = false;
        listening = false;
        try {
            if (manageConnection.mmInStream != null) {
                manageConnection.mmInStream.close();
                manageConnection.mmInStream = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            if (manageConnection.mmOutStream != null) {
                manageConnection.mmOutStream.close();
                manageConnection.mmOutStream = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            mmSocket.close();
            mmSocket = null;
            manageConnection = null;
        } catch (IOException e) {
              // Logging code
        }
    }
}

Прослушивание:

        while (listening == true) {
            try {

                synchronized (ListeningActivity.lock) {
                    buffer = new byte[mmInStream.available()];

                    mmInStream.read(buffer);
....

            } catch (IOException e) {
                // Code that calls cancel()

0 ответов

Другие вопросы по тегам