¿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:
- Conexión larga de sondeo TCP de Android
- Audio de la corriente del androide al servidor
- Comunicación de socket cliente / servidor de Android mediante Service o IntentService
- Socket Android: java.net.SocketException: No hay ruta para alojar
- Implementación cliente / servidor de socket TCP de Android
@@@ 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.
- Android: ¿Cómo detectar la aplicación eliminada de la lista de aplicaciones recientes?
- ¿Hay algún mecanismo de devolución de llamada en android cuando hay datos disponibles para leer en socket
- Comunicación con Java socket de Android con Socket.IO
- InetAddress.getLocalHost (). GetHostAddress () devuelve 127.0.0.1 en Android
- Conexión de dos teléfonos Android para transferir datos entre ellos a través de WIFI
- Cuál es la mejor aproximación para enviar grandes paquetes UDP en secuencia
- Android - Socket del servidor
- Pérdida severa de paquetes UDP en algunos dispositivos Android
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"
- GridView dentro de ExpandableListView con múltiples opciones en Android
- Cómo eliminar la ventana de mensaje Problemas de procesamiento en Intellij IDEA 13 vista previa del diseño