La ubicación debe estar habilitada para escaneo de bajo consumo de energía Bluetooth en Android 6.0

Después de actualizar a Android versión 6.0, el escaneo Bluetooth Low Energy (BLE) solo funcionará si los servicios de ubicación están habilitados en el dispositivo. Consulte aquí para 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 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 precisos 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 sus dispositivos (GPS, etc.) para usar mi aplicación.

Anteriormente, el método startScan() se ejecutaba y devolvía resultados con los servicios de ubicación desactivados en el teléfono. Sin embargo, en Marshmallow, la misma aplicación “escaneaba” pero fallaba silenciosamente y no arrojaba resultados cuando los servicios de localización no estaban habilitados en el teléfono y los permisos de ubicación / campo / fin aún estaban en el manifiesto.

No, esto no es un error.

Este problema fue llevado a Google, donde respondieron diciendo que este era el comportamiento previsto y que no lo arreglará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 hacer que sus usuarios conozcan el requisito.

Sin embargo, en el problema no se explica por qué se requieren servicios de ubicación (GPS, etc.) y no parece que vayan a revisar el problema para explicar esto, ya que se ha marcado como el comportamiento previsto.

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

Lo resolví 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.

Lo que encontré es que después de Android 6 debes otorgar el permiso ACCESS_COARSE_LOCATION. Pero en algunos dispositivos también es necesario que se encienda el servicio de ubicación del teléfono (GPS) para que pueda descubrir los dispositivos periféricos. Encontré que usar Nexus 5x, con Android 7.0.

Puede usar BluetoothAdapter.startDiscovery() .
Analizará los dispositivos Bluetooth Bluetooth y los dispositivos Bluetooth clásicos, pero no es necesario que los servicios de localización estén habilitados.
(Aún necesita permisos ACCESS_COARSE_LOCATION en Android 6.)

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

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

También puedes verificar esto para comprobar si tu 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 mostrará aquí solo si ha proporcionado ACCESS_COARSE_LOCATION en el manifiesto.

Bueno, he visto 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. Aún recibo la callback adecuada. ¿Has intentado ejecutar el código sin la statement de ubicación? Por otro lado, puede usar el startLeScan obsoleto (API 18) que no requiere estos permisos. Sin embargo, en mi opinión, buscar y leer las características deseadas en el servicio es más complicado con los métodos API 18.