¿Cómo puedo cerrar BluetoothSocket en la rotación de la pantalla en Android?

Estoy haciendo una aplicación que utiliza la conexión Bluetooth. Estoy llamando a la conexión bluetooth en onCreate() y cerrándolo en onDestroy() de MainActivity :

 // Bluetooth private Bluetooth bt; private boolean registered = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = new Bluetooth(this); bt.enableBluetooth(); bt.setCommunicationCallback(this); bt.connectToName(bt.getBluetoothDevice(this)); IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mReceiver, filter); registered = true; } @Override public void onDestroy() { super.onDestroy(); if(registered) { unregisterReceiver(mReceiver); registered=false; } bt.removeCommunicationCallback(); bt.disconnect(); if (handler != null && runnable != null) { handler.removeCallbacks(runnable); } } 

La aplicación también admite modos LANDSCAPE y PORTRAIT (utilizando dos diseños diferentes). Cuando se gira la pantalla, MainActivity llama a las onCreate() y onDestroy , debido a un diseño diferente. Por esa razón, recibí el siguiente error:

 @@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x5a71aa38 A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1051 (le.bluetoothled) 

Como encontré en la dirección de heap inválida y la señal fatal 11 , era del método close() de BluetoothSocket. En primer lugar, creo que no necesitamos cerca bluetooth cuando giramos la pantalla, por lo tanto, traté de utilizar el método para detectar el evento de rotación de teléfono e ignorar el cierre cuando ocurre la rotación, sin embargo, no funciona. Por lo tanto, creo que puede ser necesario cerrar el bluetooth cuando la rotación de la pantalla, pero tengo el error anterior. No tengo ni idea de cómo puedo resolver esto, ¿podría ayudarme a resolver ese problema? Estoy utilizando este Bluetooth lib con disconnect() siguiente manera:

 public void disconnect() { try { socket.close(); } catch (IOException e) { if(communicationCallback!=null) communicationCallback.onError(e.getMessage()); } } 

Como mi solución actual está utilizando el sueño. He añadido Thread.sleep (1000) antes de cerrar socket. Está funcionando. Pero creo que no es una solución muy buena.

NO DEBE utilizar las cosas relacionadas con Bluetooth dentro de la actividad (ver SOLID). La actividad es sólo una interfaz de usuario. Debería crear un servicio independiente, que funcionará independientemente de la interfaz de usuario en segundo plano y que gestionará todas las acciones relacionadas con Bluetooth. Desde su actividad enlazar a ese servicio en el método onResume () y desvincularlo en el método onPause (). Puede obtener bt- interfaz de control de ServiceConnection, pasada por el servicio durante el enlace. Hay un gran ejemplo de Bluetooth de Google – https://github.com/googlesamples/android-BluetoothChat . El único inconveniente – que utiliza Handler para pasar mensajes. Lo he modificado slightely – ahora hay otro hilo, recibiendo todos los mensajes de estado y callback de llamada. Siéntase libre de usar este código: https://github.com/AlexShutov/LEDLights

Puede agregar Fragment dentro de su actividad y llamar a setRetainInstnce este fragmento para manejar los cambios de orientación. Mueva su lógica con bluetooth en el Fragment . Echa un vistazo a cómo implementar esto aquí y aquí .

Prueba este código

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //disconnect your bluetooth } 

Agregue esta etiqueta en el archivo de manifiesto en la etiqueta de actividad respetada. Después de agregar esta etiqueta a manifestarse en actividad respetada, la actividad puede conservar su estado y durante el cambio de orientación onDestroy () no se llama y el socket bluetooth no está cerrado.

Android: configChanges = "keyboardHidden | orientación | screenSize"

  • ¿Cómo puedo manejar múltiples clientes conectados a un servidor mediante sockets?
  • Android socket de programación ... ¿qué da?
  • Android escucha los mensajes del socket del servidor
  • DatagramSocket.bind (); Socket excepción: no se puede asignar la dirección solicitada. Emulador de Android
  • ¿Cuál es el tiempo de espera predeterminado de java.net.Socket en android?
  • Conexión de socket SSL
  • ¿Cómo mantener el cliente android conectado al servidor incluso en los cambios de actividad y enviar datos al servidor?
  • Java socket IOException - permiso denegado
  • Android VpnService - ¿Cómo reenviar el tráfico interceptado de Internet?
  • Cómo pasar datos del servidor a la aplicación de Android: REST vs Sockets
  • Envío de datos TCP desde Android (como cliente) - ¿no se envían datos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.