android - studio - "El recurso compartido Bluetooth ha dejado de funcionar" al realizar LeScan
recibir datos bluetooth android (4)
Tengo un montón de varios teléfonos Android delante de mí, todos corriendo 4.3 / 4.4 y todos parecen estar sufriendo algún error en Bluetooth. La aplicación que estoy ejecutando simplemente busca otros dispositivos Bluetooth a su alrededor usando esta devolución de llamada: http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.LeScanCallback.html
Solo LogCatting the data y aún teniendo problemas ...
¿Alguien sabe acerca de este error y tiene una solución para ello? Realmente necesito que el escaneo con bluetooth sea estable para un plazo que tengo mañana para una demostración de mi aplicación ...
Gracias.
EDITAR: Supuestamente en 4.4.3 (o 4.4.4) esto se resolvió. (Por supuesto, el día de nuestra presentación para el proyecto ... no nos sirvió de nada). El problema principal era que el archivo XML realizara un seguimiento de las direcciones MAC que crecían por encima del tamaño de 2000 y luego se bloqueaba ... un restablecimiento del sistema borraba el archivo xml, resolviendo así el problema temporalmente.
Este es un error en el código del bluetooth de Android que no parece tener una resolución en este momento. Como otras personas siguen encontrando esto también, voy a publicar lo que encontré al rastrear el problema a través de la pila de bluetooth, aunque realmente no se puede aplicar como una resolución a menos que uno esté preparado para realizar cambios importantes en una base AOSP instalar.
Fundamentalmente, el problema es un SIGSEGV en btif_config.c en find_add_node () cuando alloc_node () falla después de escuchar demasiadas direcciones de hardware BTLE únicas.
Parte informativa del seguimiento de la pila
D/BtGatt.btif(22509): btif_gattc_upstreams_evt: Event 4096
D/BtGatt.btif(22509): btif_gattc_add_remote_bdaddr device added idx=1
D/BtGatt.btif(22509): btif_gattc_update_properties BLE device name=beacon len=6 dev_type=2
F/libc (22509): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 22530 (BTIF)
I/DEBUG ( 171): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 171): Build fingerprint: ''google/occam/mako:4.4.2/KOT49H/937116:user/release-keys''
I/DEBUG ( 171): Revision: ''11''
I/DEBUG ( 171): pid: 22509, tid: 22530, name: BTIF >>> com.android.bluetooth <<<
I/DEBUG ( 171): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG ( 171): r0 ffffffff r1 00007d00 r2 00007c60 r3 74c7cf00
I/DEBUG ( 171): r4 74c7cf10 r5 00000000 r6 756f95a8 r7 7503c671
I/DEBUG ( 171): backtrace:
I/DEBUG ( 171): #00 pc 0004e68c /system/lib/hw/bluetooth.default.so
I/DEBUG ( 171): #01 pc 0004ea65 /system/lib/hw/bluetooth.default.so (btif_config_set+156)
Desarmando, el código en cuestión es esta serie bastante obvia de eliminación de r5 y luego intenta desviarla como un puntero base:
4e68a: 2500 movs r5, #0
4e68c: 6829 ldr r1, [r5, #0]
4e68e: b919 cbnz r1, 4e698 <btif_gattc_test_command_impl+0x74c>
4e690: 4630 mov r0, r6
4e692: f7dd ef78 blx 2c584 <strdup@plt>
Esto corresponde a la comprobación "if (! Node-> name)" al final de find_add_node ()
static cfg_node* find_add_node(cfg_node* p, const char* name)
{
int i = -1;
cfg_node* node = NULL;
if((i = find_inode(p, name)) < 0)
{
if(!(node = find_free_node(p)))
{
int old_size = alloc_node(p, CFG_GROW_SIZE);
if(old_size >= 0)
{
i = GET_NODE_COUNT(old_size);
node = &p->child[i];
ADD_CHILD_COUNT(p, 1);
} /* else clause to handle failure of alloc_node() is missing here */
} else ADD_CHILD_COUNT(p, 1);
}
else node = &p->child[i];
if(!node->name) /* this will SIGSEGV if node is still NULL */
node->name = strdup(name);
return node;
}
Específicamente, no hay ninguna cláusula adicional para manejar la falla de alloc_node (), así que cuando eso sucede (presumiblemente debido a quedarse sin almacenamiento después de escuchar demasiadas direcciones de dispositivos) el código falla e intenta desreferenciar el nombre del miembro del puntero del nodo sin haberlo configurado en una dirección no nula.
Una solución presumiblemente necesitaría involucrar:
manejo sin errores de este caso de error cuando no se puede asignar un nuevo registro
descarte más agresivo de las direcciones escuchadas en el pasado cuando se escuchan las nuevas y el número de registros almacenados se vuelve irracional
Alguien acaba de abrir un problema: https://code.google.com/p/android/issues/detail?id=67272 . Cualquier evidencia de apoyo debe ir allí y con suerte Google soluciona esto en la próxima versión.
Esta es probablemente una causa rara, pero tuve este problema al tratar de usar un L Tone con mi Galaxy Nexus. Intenté varias soluciones, pero nada funcionó, entonces recordé que instalé una aplicación (en mi teléfono rooteado) que habilitaba Bluetooth LE (Normalmente 4.3 en Galaxy Nexus no tiene acceso). Una vez que desinstalé los archivos que la aplicación instaló, parece estar funcionando bien.
Entonces, si algo no funciona, pregúntate si has hecho algo personalizado en el teléfono que pueda ser conflictivo.
Arreglo que funcionó para mi S4 (i9500): después de instalar una ROM personalizada para Android 5.1.1, comencé a enfrentar este problema de ''Bluetooth detenido''. Como mi teléfono estaba rooteado, instalé la aplicación ''Root Uninstaller'' y los servicios de FROZE bluetooth. No he tenido ningún problema después de eso. Pero nuevamente no estoy seguro de si mi bluetooth funciona correctamente. Es solo que ya no recibo esas molestas ventanas emergentes. Espero que esto ayude a alguien !