Demander des autorisations matérielles pour les lunettes audio et les lunettes à écran

Appareils XR concernés
Ces conseils vous aideront à créer des expériences pour ces types d'appareils XR.
Lunettes audio et
à écran

Tout comme sur un téléphone, l'accès à des composants matériels sensibles tels que l'appareil photo et le micro sur des lunettes audio et des lunettes avec affichage nécessite le consentement explicite de l'utilisateur. Il s'agit d'autorisations spécifiques aux lunettes, et votre application doit les demander au moment de l'exécution, même si elle dispose déjà des autorisations correspondantes sur le téléphone.

Déclarer les autorisations dans le fichier manifeste de votre application

Avant de demander des autorisations, vous devez les déclarer dans le fichier manifeste de votre application à l'aide de l'élément <uses-permission>. Cette déclaration reste la même, que l'autorisation concerne une fonctionnalité spécifique au téléphone ou aux lunettes. Toutefois, vous devez toujours la demander explicitement pour le matériel ou les fonctionnalités spécifiques aux lunettes.

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

Avant de demander des autorisations pour les lunettes

Consultez les principes et workflows d'autorisation pour vous assurer de fournir une expérience optimale à vos utilisateurs, par exemple en vérifiant si l'utilisateur a déjà accordé les autorisations d'exécution requises par votre application et si votre application doit afficher une justification à l'utilisateur avant de demander des autorisations spécifiques aux lunettes.

Scénarios d'autorisation

Vous pouvez être confronté à plusieurs scénarios lorsque vous demandez des autorisations d'exécution dangereuses sur des lunettes audio et à écran :

  • Demander des autorisations d'exécution à partir d'une activité projetée
  • Demander des autorisations d'exécution à partir d'une activité sur téléphone

Pour en savoir plus sur chaque scénario, consultez les sections suivantes de ce guide.

Demander des autorisations d'exécution à partir d'une activité projetée

Pour demander des autorisations d'exécution pour des lunettes audio ou avec affichage à partir d'une activité projetée, utilisez la méthode ProjectedActivityCompat.requestPermissions.

L'appel de cette méthode déclenche un flux utilisateur coordonné à la fois sur les lunettes et sur le téléphone hôte.

  1. Sur les lunettes : le système ouvre une activité associée projetée sur les lunettes, invitant l'utilisateur à consulter son téléphone pour répondre à la demande d'autorisation.
  2. Sur le téléphone : une boîte de dialogue d'autorisation du système Android s'affiche sur l'écran du téléphone. La boîte de dialogue indique explicitement que l'utilisateur accorde l'autorisation pour les lunettes et non pour le téléphone lui-même. L'utilisateur peut alors accepter ou refuser la demande.

L'exemple suivant montre comment demander des autorisations pour les lunettes à partir d'une activité projetée :

@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)
        }
    }
}

Points clés concernant le code

  • Utilisez ProjectedActivityCompat.requestPermissions à la place de la méthode ActivityCompat standard. Cette méthode cible explicitement les autorisations d'exécution pour l'audio et les lunettes avec affichage, plutôt que pour le téléphone hôte.

Gérer les résultats des autorisations

Une fois que l'utilisateur a répondu à la boîte de dialogue d'autorisation sur le téléphone, sa décision est transmise à votre application en appelant le rappel onRequestPermissionsResult.

Le système ferme automatiquement l'activité associée projetée. Sur les lunettes audio, cela se produit une fois l'alerte audio terminée. Sur les lunettes avec affichage, cela se produit une fois que l'utilisateur a répondu à toutes les boîtes de dialogue d'autorisation.

Pour gérer la réponse, remplacez onRequestPermissionsResult() dans l'instance Activity qui a lancé la demande d'autorisation.

L'extrait de code suivant montre comment gérer le rappel et vérifier si l'utilisateur a accordé les autorisations demandées :

@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()
    }
}

Points clés concernant le code
  • Utilisez la surcharge deviceId avec le rappel onRequestPermissionsResult pour vous assurer que l'état de l'autorisation est correctement mappé au contexte spécifique, comme les lunettes audio ou avec affichage plutôt que le téléphone hôte.
  • Votre application doit gérer correctement les résultats accordés et refusés.

Demander des autorisations d'exécution dans une activité sur téléphone

Si votre application s'exécute dans une activité sur téléphone, mais qu'elle nécessite des autorisations pour des lunettes audio ou avec affichage (par exemple, pour permettre à un utilisateur de basculer un flux vidéo vers la caméra des lunettes pour une vue subjective), demandez les autorisations à l'aide de la méthode Activity#requestPermissions(permissions, requestCode, deviceId) spécifique à l'appareil :

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

Points clés concernant le code

  • Pour cibler les lunettes audio et les lunettes avec affichage, obtenez l'ID de l'appareil approprié à partir d'un contexte projeté que vous avez créé à l'aide de createProjectedDeviceContext. Transmettez cet ID avec votre appel à la méthode requestPermissions.

Gérer les résultats des autorisations

Une fois que l'utilisateur a répondu à la boîte de dialogue d'autorisation sur le téléphone, sa décision est transmise à votre application en appelant le rappel onRequestPermissionsResult.

Pour gérer la réponse, remplacez onRequestPermissionsResult dans l'instance Activity qui a initié la demande d'autorisation.

L'extrait de code suivant montre comment gérer le rappel et vérifier si l'utilisateur a accordé les autorisations demandées :

@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()
    }
}

Points clés concernant le code
  • Utilisez la surcharge deviceId avec le rappel onRequestPermissionsResult pour vous assurer que l'état de l'autorisation est correctement mappé au contexte spécifique, tel que les lunettes audio ou d'affichage plutôt que le téléphone hôte.
  • Votre application doit gérer correctement les résultats accordés et refusés.