Android-соединение Bluetooth не закрывается после сбоя приложения
Я использую профиль SPP для подключения к моему устройству:
Set<BluetoothDevice> devices = ba.getBondedDevices();
for(BluetoothDevice bd : devices)
{
String name = bd.getName();
if(name.equals("CELLMETER"))
{
try
{
BluetoothSocket bs = bd.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
bs.connect();
} catch (IOException e)
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
Все кажется хорошо, я создал функцию, где я закрываю входные буферы вывода и закрываю сокет. Но когда происходит сбой приложения или я останавливаю приложение, когда приходят точки останова, сокет не закрывается, даже после того, как я вручную завершил процесс, и он не доступен для нового соединения из нового экземпляра приложения.
Что я делаю не так? Для каждой операции сбоя / отладки я должен перезагрузить телефон:(
Это проявляется только на Android 2.3.5 (Samsung 5830i) и на Android 4.0.4 (Freelander P10). На моем Android 4.2.1 (Galaxy Nexus) все окей, после сбоя приложения соединение закрывается автоматически. (кажется, потому что появился новый стек Bluetooth)
2 ответа
Я вижу 2 варианта для решения этой проблемы: 1- Добавьте UncaughtExceptionHandler в ваше приложение, лучше всего в классе, производном от приложения:
mUEHandler = new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
// Close any opened sockets here
defaultUEH.uncaughtException(t, e);
}
};
Thread.setDefaultUncaughtExceptionHandler(mUEHandler);
Но это только заботится о сбоях приложения. Если пользователь убьет приложение, он вообще туда не попадет.
2. Сохраните некоторые идентификаторы сокетов, которые позволят вам закрыть его при перезапуске приложения.
Это не идеально, но это может обойти вашу проблему.
Я решил эту проблему, позволив моим BluetoothSockets управлять Службой, работающей в своем собственном процессе. Я открываю, закрываю, читаю и записываю сокеты, передавая сообщения в Службу и из нее. В случае сбоя приложения Служба корректно завершает работу, закрывая сокеты. (Он не закрывается чисто, если он работает в том же процессе, что и приложение.)