Emparejamiento Bluetooth-Diseño Android
Ya en febrero de 2020, escribí un artículo sobre cómo la ubicación se vuelve más complicada en términos de privacidad.La principal motivación de esta publicación es la necesidad de escanear y emparejar por Bluetooth ACCESS_LOCATION_FINE
Permisos que pueden confundir a los usuarios. ¿Por qué una aplicación conectada a un dispositivo Bluetooth necesita acceder a mi ubicación? La razón de esto es que la ubicación se puede determinar a partir de dispositivos conocidos (como balizas). Estos pueden tener ubicaciones fijas. Android 12 presenta nuevos permisos que ya no son necesarios ACCESS_LOCATION_FINE
Esto es realmente bueno. Esto hará que los usuarios se sientan menos confundidos. También es más fácil para los desarrolladores justificar ciertos permisos.Sin embargo, no tenemos que esperar hasta Android 12 para eliminar ACCESS_LOCATION_FINE
Al realizar la exploración y el emparejamiento de Bluetooth. En este artículo, exploraremos estas opciones.
Antes de comenzar, necesito establecer algunas expectativas. Esta no será una guía práctica detallada. Pero más es resumir las diversas opciones disponibles para diferentes versiones de Android.Espero que permita a las personas determinar la estrategia correcta a utilizar. minSdkVersion
Su aplicación y otros requisitos.
Android 12
Primero veamos los nuevos permisos agregados en Android 12.estos son BLUETOOTH_SCAN
con BLUETOOTH_CONNECT
. Son un sustituto directo de la tradición. BLUETOOTH_ADMIN
con BLUETOOTH
Permisos, respectivamente.La diferencia es que también se requieren permisos heredados ACCESS_LOCATION_FINE
Debe solicitarse como permiso de ejecución.
Esto BLUETOOTH_SCAN
Los permisos tienen un calificador opcional para declarar si la aplicación utilizará datos escaneados para detectar la ubicación. Los resultados especificados no se utilizarán para determinar la ubicación, lo que puede dar como resultado un conjunto de resultados de escaneo más pequeño. Se puede omitir cualquier dispositivo que pueda determinar la ubicación (como una baliza).Si especifica que se utilizará para el posicionamiento, también debe obtener ACCESS_LOCATION_FINE
De lo contrario, el escaneo fallará.
Antes de Android 12
Pocas aplicaciones pueden usar Android 12 como minSdkVersion. Por lo tanto, debemos declarar los permisos relacionados para diferentes niveles de API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 |
<?xml versión=«1.0» codificación=«Utf-8»?> <aparecer xmlns:Androide=«Http://schemas.android.com/apk/res/android» paquete=«…»> <usar——permitir Androide:nombre=«Android.permission.BLUETOOTH» Androide:Versión máxima de SDK=«30» /> <usar——permitir Androide:nombre=«Android.permission.BLUETOOTH_ADMIN» Androide:Versión máxima de SDK=«30» /> <usar——permitir Androide:nombre=«Android.permission.BLUETOOTH_SCAN» Androide:Usar señal de permiso=«Nunca por ubicación» /> <usar——permitir Androide:nombre=«Android.permission.BLUETOOTH_CONNECT» /> <usar——permitir Androide:nombre=«Android.permission.ACCESS_FINE_LOCATION» Androide:Versión máxima de SDK=«30» /> <solicitud ... /> </aparecer> |
Aquí declaramos ambos BLUETOOTH
con BLUETOOTH_ADMIN
Permisos, pero cada uno tiene android:maxSdkVersion="30"
Calificadores. Estos permisos solo son necesarios para dispositivos que ejecutan API 30 o inferior.
Esto BLUETOOTH_SCAN
Los permisos tienen android:usesPermissionFlags="neverForLocation"
Calificadores.No necesita ACCESS_FINE_LOCATION
Como resultado, se obtuvo el permiso.Por tanto, también podemos incluir android:maxSdkVersion="30"
El calificador del permiso.
Por lo tanto, no necesitamos permisos de ubicación para dispositivos con Android 12 o superior. Pero lo hacemos a un nivel de API más bajo.
En realidad, existe un método alternativo para realizar una exploración de Bluetooth por completo. Esto es para posponer las cosas al administrador de dispositivos complementarios. Android 8.0 (API 26) introdujo un administrador de dispositivos complementario. Podemos delegarlo en el administrador de dispositivos complementarios en lugar de realizar el escaneo y el emparejamiento nosotros mismos. Una buena simulación aquí es cuando se captura desde la cámara. Si necesitamos un control estricto, podemos usar una de las API de la cámara para hacerlo nosotros mismos.De lo contrario, podemos usar ACTION_IMAGE_CAPTURE
Tiene la intención de posponer esto para el servicio del sistema.
Administrador de dispositivos de apoyo
El administrador de dispositivos de apoyo funciona aproximadamente de la misma manera. Al igual que en el ejemplo de la cámara, una ventaja real es que nuestra aplicación no necesita ningún permiso para realizar esta operación. No es un permiso de Bluetooth ni un permiso de ubicación.Por supuesto, si necesitamos conectarnos al dispositivo después de emparejarnos con el administrador de dispositivos de soporte, entonces necesitamos BLUETOOTH
o BLUETOOTH_CONNECT
Permisos. Pero estos no son permisos de tiempo de ejecución. Tampoco necesitan permisos de ubicación.
Otra ventaja de usar el administrador de dispositivos complementario es que elimina la complejidad y mucho trabajo de la interfaz de usuario. Escanear y emparejar a través de Bluetooth puede ser complicado, especialmente cuando diferentes dispositivos se comportan de manera diferente. El jefe de equipo de apoyo nos exime de esta responsabilidad.
El precio de esto es similar al del ejemplo de la cámara. Una vez que le damos el control al administrador de dispositivos de soporte, perdemos la propiedad de UI / UX. Esto significa que no podremos controlar la IU de selección de dispositivo.
Personalmente, creo que esta es una compensación que vale la pena. ¡Aunque muchos propietarios de productos y diseñadores pueden estar en desacuerdo! Si tengo que convencer a la gente, adoptaré el enfoque de que deberíamos utilizar un administrador de dispositivos complementario. Esto proporcionará una implementación robusta y confiable con un esfuerzo mínimo. Luego, podemos agregar tareas a la lista de tareas pendientes para poder volver a visitarlas más tarde y hacer algunas cosas más personalizadas.
Panorama general
Consideremos un minSdkVersion="21"
solicitud. El hecho inevitable es que debemos comportarnos de manera diferente en diferentes niveles de API.
Si queremos utilizar el administrador de dispositivos complementario, solo puede funcionar en dispositivos API 26 y superiores. Por lo tanto, necesitamos escanear y emparejar manualmente los dispositivos más antiguos que ejecutan los niveles de API 21-25. Luego, en dispositivos posteriores, podemos usar el administrador de dispositivos de soporte.Esto significa ubicación y BLUETOOTH_ADMIN
El permiso más alto requiere API nivel 25, podemos usar android:maxSdkVersion="25"
El calificador en nuestra declaración de manifiesto.
Si no usamos el administrador de dispositivos complementario, implementaremos nuestro propio escaneo y emparejamiento para todos los niveles de API. Sin embargo, podemos cambiar los permisos de API 31 y superiores. De esta forma, solo necesitamos permisos de ubicación hasta API 30.
Algunas personas pueden argumentar que el segundo método requiere menos trabajo. Sin embargo, refutaré esto, porque creo que el administrador de dispositivos complementario será más poderoso. La mayoría de nuestros usuarios tenderán a utilizar una versión superior de Android. Brindaremos una mejor calidad de servicio a los usuarios que utilizan equipos más nuevos. Además, solo necesitamos explicar los permisos de ubicación a los usuarios en dispositivos anteriores a API 26. El administrador de dispositivos complementarios no requiere que nuestra aplicación tenga este permiso.
En conclusión
El escaneo y el emparejamiento de Bluetooth no son fáciles de conseguir. Tener que considerar diferentes niveles de API, esto es algo complicado. Espero que este artículo pueda ayudar a quienes tienen que diseñar dichos componentes. La decisión final principal es si utilizar su propia implementación para todos los niveles de API o utilizar el administrador de dispositivos complementario cuando sea posible.
No hay código fuente adjunto a este artículo.
relacionados
Copyright © 2021 Estilo de Android. reservados todos los derechos.