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

99

Después de actualizar a la versión 6.0 de Android Bluetooth Low Energy (BLE), el escaneo 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 el permiso habilitado para la aplicación y también para el teléfono. ¿Es esto un error? ¿Es posible escanear sin que los servicios de ubicación estén realmente habilitados? No quiero tener la ubicación de todas mis aplicaciones.

EDITAR No mencioné que estoy usando el startScan()método BluetoothLeScannerproporcionado en API 21. Estoy de acuerdo con el curso y los permisos de ubicación fina 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 startScan()método se ejecutaba y devolvía resultados con los servicios de ubicación deshabilitados en el teléfono. En Marshmallow, sin embargo, la misma aplicación "escaneaba" pero fallaba silenciosamente y no devolvía ningún resultado cuando los servicios de ubicación no estaban habilitados en el teléfono y los permisos del curso / ubicación fina todavía estaban en el manifiesto.

V-PTR
fuente
¿Qué dispositivos estás usando? Me encontré con el mismo problema con un Moto G 2nd Generation. Moto G 1st Generation y Nexus 6 funcionan bien con exactamente el mismo código sin habilitar explícitamente los servicios de ubicación.
shadowhorst
Lo he notado en cualquier dispositivo que ejecute Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Respuestas:

85

No, esto no es un error.

Este problema se planteó a Google, donde respondieron diciendo que este era el comportamiento previsto y que no lo solucionarían. Dirigieron a los desarrolladores a este sitio donde señala que ahora se necesita el permiso de ubicación para acceder al identificador de hardware. Ahora es responsabilidad del desarrollador informar a sus usuarios del 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 explicar esto, 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 escaneo que hubieran tenido si fueran vistos como resultado de startScan().

V-PTR
fuente
11
Google afirma que no es un error me deja frío. Su actitud es simplemente una tontería.
Marki
21
No es realmente un error: si un desarrollador de aplicaciones malintencionado puede buscar balizas bluetooth conocidas, entonces puede averiguar su ubicación sin levantar sospechas del usuario solicitando permisos de ubicación. Por lo tanto, pedir acceso a BLE debe tratarse de la misma forma que pedir su ubicación aproximada.
ArtHare
3
@orionelenzil "El otro permiso que debe declarar es ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION. Se requiere un permiso de ubicación porque los escaneos de Bluetooth se pueden usar para recopilar información sobre la ubicación del usuario". de developer.android.com/guide/topics/connectivity/bluetooth
ArtHare
7
Déjame ver si tengo esto claro. La gran ventaja de BLE es el bit "LE", es decir, Low Energy, lo que significa un consumo reducido de mi batería. Por supuesto, para obtener esos ahorros, tengo que encender el GPS, que es un conocido consumidor de batería, anulando así cualquier ahorro de energía que podría haber obtenido del uso de BLE. Yo sacudo la cabeza con incredulidad.
dgnuff
8
Esto es increíble. Seguramente, si a Google le preocupaba que los escaneos BLE se usaran para inferir la ubicación, deberían haber agregado un permiso separado para eso, en lugar de tirar al bebé con el agua del baño obligando al usuario a permitir el acceso al GPS.
Desty
11

Resolví esto estableciendo targetSdkVersionen 22 en el archivo Gradle. Debes declararACCESS_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.

Editar

Esta solución ya no debe usarse ya que Google Play requerirá que las nuevas aplicaciones se orienten al menos a Android 8.0 (API nivel 26). Las aplicaciones deben solicitar permiso de ubicación para el escaneo BLE.

JiTHiN
fuente
¡Muchas gracias! ¿Tiene una idea de qué hacer con bibliotecas que simulan el monitoreo como AltBeacon, por ejemplo? No funcionan sin la ubicación en :( y están usando básicamente el mismo mecanismo ... ¿Y qué pasa con la versión de compilación mínima? @JiTHiN
Shahar Lahav
Se rebajó de 23 a 22 y funciona incluso en Android 7.0. Mi problema inicial era que tenías que habilitar la localización, ahora puedo escanear dispositivos BLE con la localización deshabilitada.
Mariusz Wiazowski
1
Esto es un truco, sin embargo, NO SE RECOMIENDA , siempre es mejor apuntar a las últimas versiones de SDK. La forma correcta de hacer esto es solicitar ACCESS_COARSE_LOCATIONen tiempo de ejecución
Aaron
2
Esta ya no es una solución (consulte developer.android.com/distribute/best-practices/develop/… "Google Play requerirá que las nuevas aplicaciones apunten al menos a Android 8.0 (API nivel 26) a partir del 1 de agosto de 2018, y que las actualizaciones de la aplicación están destinadas a Android 8.0 a partir del 1 de noviembre de 2018. ")
Étienne
10

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 el servicio de ubicación de su teléfono (GPS) esté encendido, para que pueda descubrir dispositivos periféricos. Descubrí que usando Nexus 5x, con Android 7.0.

Ivaylo Pankov
fuente
1
Lo mismo para mí con Nexus 5x y Android 6
protegido
Lo mismo en Moto G5 plus con Android 7.1.1
RootCode
3

También probé esto en el 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 está funcionando bien:

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

La ubicación se enumerará aquí solo si proporcionó ACCESS_COARSE_LOCATION en el manifiesto.

Kamal Kishore
fuente
1
Sí, debe solicitar explícitamente el permiso en tiempo de ejecución, así como activar los servicios de ubicación para el dispositivo. Pero me preguntaba si había una manera de hacer un escaneo BLE sin tener que activar los servicios de ubicación o solicitar el permiso de ubicación del curso en tiempo de ejecución.
V-PTR
Solicitar permisos no es suficiente, debe verificar si los servicios de ubicación también están habilitados.
drindt
2

Puede utilizar BluetoothAdapter.startDiscovery().
Buscará dispositivos Bluetooth Smart y Bluetooth clásicos, pero no es necesario habilitar los servicios de ubicación.
(Aún necesitas ACCESS_COARSE_LOCATIONpermisos en Android 6.)

Puede llamar BluetoothDevice.getTypea los dispositivos encontrados para filtrar los dispositivos Bluetooth Smart / Low Energy.

Noctis
fuente
0

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

Michał Dobi Dobrzański
fuente
Estoy usando la startScanfunción en BluetoothLeScanner. Estoy usando a propósito los métodos no obsoletos. De hecho, estoy comprobando los dispositivos que utilizan API superiores a 21 para utilizar específicamente los nuevos métodos proporcionados. Intenté sin la ubicación y simplemente falla silenciosamente. El escaneo se ejecuta pero no se devuelve nada (usando el método post-API 21)
V-PTR
0

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

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

Lee Boon Kong
fuente