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 BluetoothLeScanner
proporcionado 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.
Respuestas:
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 destartScan()
.fuente
Resolví esto estableciendo
targetSdkVersion
en 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.
fuente
ACCESS_COARSE_LOCATION
en tiempo de ejecuciónLo 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.
fuente
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.
fuente
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_LOCATION
permisos en Android 6.)Puede llamar
BluetoothDevice.getType
a los dispositivos encontrados para filtrar los dispositivos Bluetooth Smart / Low Energy.fuente
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.
fuente
startScan
función enBluetoothLeScanner
. 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)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.fuente