Как закрыть все предыдущие разъемы Bluetooth после запуска моего приложения?
В моем приложении я открываю и закрываю разъем Bluetooth на одном и том же устройстве каждый сеанс и прослушиваю данные. Когда я закрываю один, я обязательно закрываю входной и выходной потоки, а затем cancel
метод. Тем не менее, для некоторых людей приложение продолжает пытаться читать с устройства. Я знаю, потому что я читаю журналы, которые из run()
в потоке прослушивания, где есть флаг для прослушивания, который установлен в false в cancel
и поток прослушивания завершится, когда сокет будет закрыт из-за IOException
, но этого никогда не происходит, поэтому сокет должен быть открыт. Я вижу журналы попыток чтения каждую секунду каждого дня, даже если человек не использует приложение. Это может быть потому, что приложение вылетает и cancel
метод не вызывается. В любом случае я не могу гарантировать, что метод отмены будет вызван. Как закрыть все сокеты Bluetooth, которые были ранее открыты при запуске моего приложения, если все они были открыты в новых потоках, созданных независимо?
У этого парня была та же самая проблема, но я не видел никакого решения: соединение Android Bluetooth не закрывается после сбоя приложения
Принятый ответ не годится, потому что:
Текущие пользователи не имели
UncaughtExceptionHandler
запустите этот код, и все предыдущие соединения должны быть закрыты при выходе новой версииUncaughtExceptionHandler
должен иметь ссылку на сокеты, которых у него нет. Я хочу иметь возможность закрыть любые разъемы Bluetooth при запуске приложения.Парень, который задал этот вопрос, спросил, как получить информацию о сокете для хранения, когда приложение запускается, и вы хотите закрыть их, и не получил ответа.
РЕДАКТИРОВАТЬ:
Как открыть сокет (удален лог-код):
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()