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
anteojos de visualización

Al igual que en un teléfono, el acceso a hardware sensible, como la cámara y el micrófono de los anteojos de audio y de visualización, requiere el consentimiento explícito del usuario. Estos se consideran permisos específicos de los anteojos, y tu app debe solicitarlos en 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 anteojos, pero debes solicitarlo explícitamente para el hardware o la funcionalidad específicos de los anteojos.

<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 de los anteojos

Revisa los principios y los flujos de trabajo de los 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 mostrarle una justificación al usuario antes de solicitar permisos específicos de los anteojos.

Situaciones de permisos

Hay diferentes situaciones que puedes atravesar cuando solicitas peligrosos permisos de tiempo de ejecución en anteojos de audio y de visualización:

  • Solicita permisos de tiempo de ejecución desde una actividad proyectada
  • Solicita 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.

Solicita y controla permisos de tiempo de ejecución desde una actividad proyectada

Para solicitar permisos para lentes con audio y lentes con pantalla, primero usa el ActivityResultLauncher con el método ProjectedPermissionsResultContract para registrar el selector de permisos. Cuando el usuario actúa sobre la solicitud de permiso, la devolución de llamada recibe un mapa de nombres de permisos a su estado otorgado.

// Register the permissions launcher using the ProjectedPermissionsResultContract.
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
    registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
        if (results[Manifest.permission.CAMERA] == true) {
            isPermissionDenied = false
            initializeGlassesFeatures()
        } else {
            // Handle permission denial.
            isPermissionDenied = true
        }
    }

Puntos clave sobre el código

Para activar el flujo de solicitud de permisos, pasa una lista de ProjectedPermissionsRequestParams al método launch del selector de permisos registrado. El objeto ProjectedPermissionsRequestParams agrupa los permisos del manifiesto solicitados junto con una cadena rationale personalizada. La cadena rationale debe explicar de forma clara y concisa por qué la app requiere acceso a las funciones de hardware de los anteojos (como la cámara o el micrófono).

private fun requestHardwarePermissions() {
    val params = ProjectedPermissionsRequestParams(
        permissions = listOf(Manifest.permission.CAMERA),
        rationale = "Camera access is required to overlay digital content on your physical environment."
    )
    requestPermissionLauncher.launch(listOf(params))
}

Puntos clave sobre el código

Comprende el flujo de usuarios de solicitud de permisos

Cuando inicias una solicitud de permiso con el ProjectedPermissionsResultContract método, el sistema inicia un flujo de usuarios coordinado en los anteojos y el teléfono.

Durante el flujo de usuarios de permisos, esto es lo que pueden esperar tu app y el usuario:

  1. En los anteojos: Aparece una actividad en el dispositivo proyectado (anteojos), que le indica al usuario que mire su teléfono para continuar.

  2. En el teléfono: Al mismo tiempo, se inicia una actividad en el dispositivo host (teléfono). En esta pantalla, se muestra la cadena de justificación que proporcionaste y se le da al usuario la opción de continuar o cancelar.

  3. En el teléfono: Si el usuario acepta la justificación, aparece un diálogo de permisos del sistema Android modificado en el teléfono que le indica que otorga el permiso para los anteojos (no para el teléfono), y el usuario puede otorgar o denegar formalmente el permiso.

  4. Recepción del resultado: Después de que el usuario toma su decisión final, se descartan las actividades en el teléfono y los anteojos. Luego, se invoca la devolución de llamada ActivityResultLauncher con un mapa que contiene el estado otorgado para cada permiso solicitado.

Solicita permisos de tiempo de ejecución en una actividad del teléfono

Si tu app se ejecuta en una actividad del teléfono, pero requiere permisos para anteojos de audio o de visualización (por ejemplo, para permitir que un usuario cambie una transmisión de video a la cámara de los anteojos para obtener un punto de vista en primera persona), solicita los permisos con el método específico del dispositivo Activity#requestPermissions(permissions, requestCode, deviceId).

Para orientar los anteojos de audio y de visualización, obtén el ID de dispositivo adecuado llamando a getDeviceId en un contexto de dispositivo proyectado. Pasa este ID cuando solicites permisos desde tu actividad del teléfono, como se muestra en el siguiente ejemplo:

// 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
)

Controla 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 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:

private companion object {
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant.
    const val REQUEST_CODE_GLASSES_CAMERA = 1001
}

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray,
    deviceId: Int
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)

    // Handle the result of the permission request
    if (requestCode == REQUEST_CODE_GLASSES_CAMERA && deviceId == projectedDeviceId) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Proceed with glasses camera features
        } else {
            // Handle glasses permission denied
        }
    }
}

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 anteojos de audio o de visualización en lugar del teléfono host.
  • Tu app debe controlar correctamente los resultados otorgados y denegados.