studio low library example ble app android bluetooth bluetooth-lowenergy android-6.0-marshmallow

low - La ubicación debe estar habilitada para el escaneo Bluetooth de baja energía en Android 6.0



bluetooth low energy (7)

Después de actualizar a Android versión 6.0, el escaneo Bluetooth de baja energía (BLE) solo funcionará si los servicios de ubicación están habilitados en el dispositivo. Consulte aquí como referencia: Bluetooth Low Energy startScan en Android 6.0 no encuentra dispositivos

Básicamente, debe tener habilitado el permiso para la aplicación y para el teléfono. ¿Es esto un error? ¿Es posible escanear sin los servicios de ubicación realmente habilitados? No quiero tener que tener una ubicación para todas mis aplicaciones.

EDITAR No mencioné que estoy usando el método startScan() en BluetoothLeScanner provisto en la API 21. Estoy de acuerdo con el curso y los permisos de ubicación en el manifiesto que requiere este método. Simplemente no quiero que los usuarios de mi aplicación tengan que habilitar los servicios de ubicación en su dispositivo (GPS, etc.) para usar mi aplicación.

Anteriormente, el método startScan() se ejecutaba y devolvía resultados con los servicios de ubicación deshabilitados en el teléfono. Sin embargo, en Marshmallow, la misma aplicación "escaneaba" pero fallaba silenciosamente y no devolvía resultados cuando los servicios de ubicación no estaban habilitados en el teléfono y los permisos de ubicación / curso estaban todavía en el manifiesto.


Bueno, he mirado mi código escrito en Eclipse y uso allí la función startScan (API 21) sin declarar cosas de ubicación en el archivo de manifiesto. Todavía recibo la devolución de llamada adecuada. ¿Has intentado ejecutar el código sin la declaración de ubicación? Por otro lado, puede usar el startLeScan (API 18) en desuso que no requiere estos permisos. Sin embargo, en mi opinión, buscar y leer la característica deseada en el servicio es más complicado con los métodos API 18.


Lo que encontré es que después de Android 6 debe otorgar el permiso ACCESS_COARSE_LOCATION. Pero en algunos dispositivos también es necesario que su servicio de ubicación del teléfono (GPS) esté activado, para que pueda descubrir dispositivos periféricos. Descubrí que usando Nexus 5x, con Android 7.0.


No, esto no es un error.

Este issue se trajo a Google, donde respondieron diciendo que este era el comportamiento previsto y que no lo solucionarán. Dirigieron a los desarrolladores a este sitio donde señala que ahora se necesita permiso de ubicación para acceder al identificador de hardware. Ahora es responsabilidad del desarrollador informar a sus usuarios sobre el requisito.

En el problema, sin embargo, no aborda por qué se requieren los servicios de ubicación (GPS, etc.) y no parece que vayan a volver a examinar el problema para explicarlo, ya que se ha marcado como el comportamiento previsto.

Para responder a la segunda parte de la pregunta: Sí, es posible escanear sin habilitar los servicios de Ubicación. Puede hacer un escaneo clásico de Bluetooth usando BluetoothAdapter.getDefaultAdapter().startDiscovery() y eso funcionará con los servicios de ubicación desactivados. Esto descubrirá todos los dispositivos Bluetooth, BLE y otros. Sin embargo, los dispositivos BLE no tendrán un registro de exploración que hubieran tenido si se vieran como resultado de startScan() .


Por lo que noté recientemente en Android 8.0, no es necesario encender su GPS para hacer un escaneo BLE, pero debe declararlo en el manifiesto, pero el usuario debe permitir el permiso.

Android solicitará al usuario que permita el permiso de ubicación cuando intente escanear con el método startScan() . Su escaneo fallará si el permiso no está permitido.


Puede usar BluetoothAdapter.startDiscovery() .
Buscará dispositivos Bluetooth Smart y Bluetooth clásicos, pero no es necesario habilitar los servicios de ubicación.
(Todavía necesita los permisos ACCESS_COARSE_LOCATION en Android 6.)

Puede llamar a BluetoothDevice.getType en los dispositivos encontrados para filtrar los dispositivos Bluetooth Smart / Low Energy.


También probé esto en manifiesto pero no solicité permiso, no estoy seguro de por qué. ¿Su aplicación solicita permiso de ubicación al inicio? Si no es así, debemos solicitar permiso en tiempo de ejecución .

También puede verificar esto para probar si su aplicación funciona bien:

Abra Configuración> Aplicaciones> Su aplicación> Permisos y habilite Ubicación y luego intente buscar resultados.

La ubicación se incluirá aquí solo si ha proporcionado ACCESS_COARSE_LOCATION en el manifiesto.


targetSdkVersion esto estableciendo targetSdkVersion en 22 en el archivo gradle. Debe declarar ACCESS_COARSE_LOCATION en el manifiesto, pero el escaneo BLE funcionará incluso si el usuario niega este permiso desde la Configuración de la aplicación.

Esto es solo un truco para evitar solicitar permiso de ubicación. Es mejor apuntar a las últimas versiones de Android.