Solicita permisos de hardware para anteojos de audio y anteojos con pantalla

Dispositivos de realidad extendida correspondientes
Esta guía te ayuda a crear experiencias para estos tipos de dispositivos de realidad extendida.
Audio y
lentes con pantalla

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.

  1. 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.
  2. 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.requestPermissions en lugar del método estándar ActivityCompat. 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 deviceId con la devolución de llamada onRequestPermissionsResult para 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étodo requestPermissions.

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 deviceId con la devolución de llamada onRequestPermissionsResult para 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.