Al igual que en un teléfono, acceder a hardware sensible, como la cámara y el micrófono de los lentes de audio y los lentes de pantalla, requiere el consentimiento explícito del usuario. Estos se consideran permisos específicos de los lentes, y tu app debe solicitarlos durante el tiempo de ejecución, incluso si ya tiene los permisos correspondientes en el teléfono.
Declara los permisos en el manifiesto de tu app
Antes de solicitar permisos, debes declararlos en el archivo de manifiesto de tu app con el elemento <uses-permission>. Esta declaración sigue siendo la misma, ya sea que el permiso sea para un teléfono o una función específica de los lentes, pero debes solicitarlo de forma explícita para el hardware o la funcionalidad específicos de los lentes.
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for the camera. -->
<uses-permission android:name="android.permission.CAMERA"/>
<application ...>
...
</application>
</manifest>
Antes de solicitar permisos para los lentes
Revisa los principios y flujos de trabajo de permisos para asegurarte de brindarles la mejor experiencia a los usuarios, como verificar si el usuario ya otorgó los permisos de tiempo de ejecución que requiere tu app y si tu app debería mostrar una justificación al usuario antes de solicitar permisos específicos para anteojos.
Situaciones de permisos
Hay diferentes situaciones que puedes atravesar cuando solicitas permisos de tiempo de ejecución peligrosos en anteojos de audio y pantalla:
- Cómo solicitar permisos de tiempo de ejecución desde una actividad proyectada
- Cómo solicitar permisos de tiempo de ejecución desde una actividad del teléfono
Consulta las siguientes secciones de esta guía para obtener detalles sobre cada situación.
Cómo solicitar permisos de tiempo de ejecución desde una actividad proyectada
Para solicitar permisos de tiempo de ejecución para anteojos de audio o de pantalla desde una actividad proyectada, usa el método ProjectedActivityCompat.requestPermissions.
Llamar a este método activa un flujo de usuarios coordinado en los lentes y el teléfono host.
- En los lentes: El sistema abre una actividad complementaria proyectada en los lentes y le indica al usuario que revise su teléfono para responder a la solicitud de permiso.
- En el teléfono: Aparece un diálogo de permisos del sistema Android en la pantalla del teléfono. El diálogo indica explícitamente que el usuario otorga el permiso para los lentes y no para el teléfono en sí. Luego, el usuario puede otorgar o rechazar la solicitud.
En el siguiente ejemplo, se muestra cómo solicitar permisos de anteojos desde una actividad proyectada:
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) private fun requestCameraPermission() { lifecycleScope.launch { try { ProjectedActivityCompat.requestPermissions( this@PermissionsFromProjectedActivity, arrayOf(Manifest.permission.CAMERA), // CAMERA_PERMISSION_REQUEST_CODE is a developer defined constant CAMERA_PERMISSION_REQUEST_CODE, ) } catch (e: IllegalStateException) { // Thrown when the projected system service can't be bound. Log.e(TAG, "Camera permission request failed: projected service unavailable.", e) } } }
Puntos clave sobre el código
- Usa
ProjectedActivityCompat.requestPermissionsen lugar del método estándarActivityCompat. Este método se dirige explícitamente a los permisos de tiempo de ejecución para los lentes de audio y pantalla, en lugar de al teléfono host.
Cómo controlar los resultados de los permisos
Una vez que el usuario responde al diálogo de permisos en el teléfono, su decisión se entrega a tu app invocando la devolución de llamada onRequestPermissionsResult.
El sistema cierra automáticamente la actividad complementaria proyectada. En los lentes de audio, esto ocurre después de que finaliza la reproducción de la alerta de audio. En los lentes de visualización, esto sucede después de que el usuario responde todos los diálogos de permisos.
Para controlar la respuesta, anula onRequestPermissionsResult() dentro de la instancia de Activity que inició la solicitud de permiso.
En el siguiente fragmento de código, se muestra cómo controlar la devolución de llamada y verificar si el usuario otorgó los permisos solicitados:
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray, deviceId: Int, ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId) if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return val isCameraGranted = grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) == PackageManager.PERMISSION_GRANTED if (isCameraGranted) { initializeCameraFeatures() } else { onCameraPermissionDenied() } }
Puntos clave sobre el código
- Usa la sobrecarga
deviceIdcon la devolución de llamadaonRequestPermissionsResultpara asegurarte de que el estado del permiso se asigne correctamente al contexto específico, como los lentes de audio o de pantalla, en lugar del teléfono host. - Tu app debe controlar correctamente los resultados tanto de permiso otorgado como de permiso denegado.
Cómo solicitar permisos de tiempo de ejecución en una actividad de teléfono
Si tu app se ejecuta en una actividad de teléfono, pero requiere permisos para audio o lentes con pantalla (por ejemplo, para permitir que un usuario cambie una transmisión de video por Internet a la cámara de los lentes para obtener un punto de vista en primera persona), solicita los permisos con el método Activity#requestPermissions(permissions, requestCode,
deviceId) específico del dispositivo:
// Request the projected permission from phone activity requestPermissions( arrayOf(Manifest.permission.CAMERA), // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant REQUEST_CODE_GLASSES_CAMERA, projectedDeviceId )
Puntos clave sobre el código
- Para segmentar anuncios en anteojos de audio y visualización, obtén el ID de dispositivo adecuado de un contexto proyectado que hayas creado con
createProjectedDeviceContext. Pasa este ID con tu llamada al métodorequestPermissions.
Cómo controlar los resultados de los permisos
Una vez que el usuario responde al diálogo de permisos en el teléfono, su decisión se entrega a tu app invocando la devolución de llamada onRequestPermissionsResult.
Para controlar la respuesta, anula onRequestPermissionsResult dentro de la instancia de Activity que inició la solicitud de permiso.
En el siguiente fragmento de código, se muestra cómo controlar la devolución de llamada y verificar si el usuario otorgó los permisos solicitados:
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray, deviceId: Int, ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId) if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return val isCameraGranted = grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) == PackageManager.PERMISSION_GRANTED if (isCameraGranted) { initializeCameraFeatures() } else { onCameraPermissionDenied() } }
Puntos clave sobre el código
- Usa la sobrecarga
deviceIdcon la devolución de llamadaonRequestPermissionsResultpara garantizar que el estado del permiso se asigne correctamente al contexto específico, como los lentes de audio o de visualización, en lugar del teléfono host. - Tu app debe controlar correctamente los resultados tanto de permiso otorgado como de permiso denegado.