Почему я теряю соединение клиента/сервера Bluetooth?
Вопрос
Я пытаюсь подключиться из настольного приложения (написанного на Java) к приложению Android через Bluetooth.
Для настольного приложения я использую БлюКоув API.
Когда я запускаю сервер (настольное приложение) и приложение Android, соединение работает нормально.(т.е.Клиент отправляет «Hello World», а сервер печатает его в консоли).Но когда я выхожу из приложения (нажимая кнопку «Назад» или «Домой») и возвращаюсь к нему, соединение с сокетом словно теряется.
Как проверить, подключен ли разъем Bluetooth?
Я хотел бы проверить подключение розетки, чтобы не было повторного подключения.
Что мне написать (если это так) в onPause
, onResume
методы?
Я предполагаю, что в onDestroy
метод, я должен закрыть сокет.
Вот исходный код клиентского сервера:
Сервер
Клиент
Я также пробовал использовать IntentFilter
проверить состояние соединения, но это не сработало.
@Override
public void onCreate(Bundle savedInstanceState) {
// .....
IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mReceiver, filter1);
this.registerReceiver(mReceiver, filter2);
this.registerReceiver(mReceiver, filter3);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//Device found
Toast.makeText(BluetoothClient.this, "Device not found", 2).show();
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
//Device is now connected
Toast.makeText(BluetoothClient.this, "Device connected", 2).show();
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
//Done searching
Toast.makeText(BluetoothClient.this, "Done searching", 2).show();
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
//Device is about to disconnect
Toast.makeText(BluetoothClient.this, "Device about to connect", 2).show();
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
//Device has disconnected
Toast.makeText(BluetoothClient.this, "Device disconnected", 2).show();
}
}
};
Решение
Я изменил 2 файла исходного кода.
Теперь все должно работать нормально.Есть некоторые небольшие ошибки, связанные с тем, что BT не открывается перед входом в мобильное приложение (через некоторое время оно слишком сильно зависает), и тем, кто хочет использовать этот клиент/сервер, вам следует взглянуть на onPause(), onResume(), onDestroy()
функции.
Проблема была в том, что я неправильно использовал сокет.
Надеюсь, что это будет полезно для тех, кто хочет реализовать такое приложение с помощью BT.