Richiedere le autorizzazioni hardware per gli occhiali audio e gli occhiali con display

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
Audio e
occhiali con display

Proprio come su uno smartphone, l'accesso ad hardware sensibile come la fotocamera sugli occhiali audio e sugli occhiali con display richiede il consenso esplicito dell'utente. Queste sono considerate autorizzazioni specifiche per gli occhiali e la tua app deve richiederle in fase di runtime, anche se dispone già delle autorizzazioni corrispondenti sullo smartphone.

Dichiara le autorizzazioni nel file manifest dell'app

Prima di richiedere le autorizzazioni, devi dichiararle nel file manifest dell'app utilizzando l'elemento <uses-permission>. Questa dichiarazione rimane la stessa indipendentemente dal fatto che l'autorizzazione sia per una funzionalità specifica per lo smartphone o per gli occhiali, ma devi comunque richiederla esplicitamente per l'hardware o la funzionalità specifici per gli occhiali.

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

Prima di richiedere le autorizzazioni per gli occhiali

Esamina i principi e i flussi di lavoro relativi alle autorizzazioni per assicurarti di offrire la migliore esperienza possibile agli utenti, ad esempio controllando se l'utente ha già concesso le autorizzazioni di runtime richieste dalla tua app e se la tua app deve mostrare una motivazione all'utente prima di richiedere autorizzazioni specifiche per gli occhiali.

Scenari delle autorizzazioni

Esistono diversi scenari che potresti incontrare quando richiedi autorizzazioni di runtime pericolose su occhiali con display e audio:

  • Richiedi autorizzazioni di runtime da un'attività proiettata
  • Richiedi le autorizzazioni di runtime da un'attività dello smartphone

Per informazioni dettagliate su ogni scenario, consulta le sezioni seguenti di questa guida.

Richiedi autorizzazioni di runtime da un'attività proiettata

Per richiedere le autorizzazioni di runtime per l'audio o gli occhiali con display da un'attività proiettata, utilizza il metodo ProjectedActivityCompat.requestPermissions.

La chiamata di questo metodo attiva un flusso utente coordinato sia sugli occhiali sia sullo smartphone host.

  1. Sugli occhiali: il sistema apre un'attività companion proiettata sugli occhiali, invitando l'utente a controllare lo smartphone per rispondere alla richiesta di autorizzazione.
  2. Sullo smartphone: sullo schermo dello smartphone viene visualizzata una finestra di dialogo di autorizzazione del sistema Android. La finestra di dialogo indica esplicitamente che l'utente sta concedendo l'autorizzazione per gli occhiali anziché per lo smartphone stesso. L'utente può quindi concedere o rifiutare la richiesta.

L'esempio seguente mostra come richiedere le autorizzazioni per gli occhiali da un'attività proiettata:

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

Punti chiave sul codice

  • Utilizza ProjectedActivityCompat.requestPermissions anziché il metodo standard ActivityCompat. Questo metodo ha come target esplicito le autorizzazioni di runtime per l'audio e gli occhiali con display, anziché lo smartphone host.

Gestisci i risultati delle autorizzazioni

Una volta che l'utente risponde alla finestra di dialogo delle autorizzazioni sullo smartphone, la sua decisione viene recapitata alla tua app richiamando il callback onRequestPermissionsResult.

Il sistema chiude automaticamente l'attività complementare proiettata. Sugli occhiali audio, questo avviene al termine della riproduzione dell'avviso audio. Sugli occhiali con display, questo avviene dopo che l'utente ha risposto a tutte le finestre di dialogo relative alle autorizzazioni.

Per gestire la risposta, esegui l'override di onRequestPermissionsResult() all'interno dell'istanza Activity che ha avviato la richiesta di autorizzazione.

Il seguente snippet di codice mostra come gestire il callback e verificare se l'utente ha concesso le autorizzazioni richieste:

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

Punti chiave sul codice
  • Utilizza l'overload deviceId con il callback onRequestPermissionsResult per assicurarti che lo stato dell'autorizzazione sia mappato correttamente al contesto specifico, ad esempio gli occhiali audio o con display anziché lo smartphone host.
  • La tua app deve gestire correttamente sia i risultati concessi sia quelli negati.

Richiedi autorizzazioni di runtime in un'attività dello smartphone

Se la tua app è in esecuzione in un'attività dello smartphone, ma richiede autorizzazioni per l'audio o gli occhiali con display, ad esempio per consentire a un utente di passare uno stream video alla fotocamera degli occhiali per una visuale in prima persona, richiedi le autorizzazioni utilizzando il metodo Activity#requestPermissions(permissions, requestCode, deviceId) specifico 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
)

Punti chiave sul codice

  • Per scegliere come target gli occhiali con display e audio, ottieni l'ID dispositivo appropriato da un contesto proiettato che hai creato utilizzando createProjectedDeviceContext. Passa questo ID con la chiamata al metodo requestPermissions.

Gestisci i risultati delle autorizzazioni

Una volta che l'utente risponde alla finestra di dialogo delle autorizzazioni sullo smartphone, la sua decisione viene recapitata alla tua app richiamando il callback onRequestPermissionsResult.

Per gestire la risposta, esegui l'override di onRequestPermissionsResult all'interno dell'istanza Activity che ha avviato la richiesta di autorizzazione.

Il seguente snippet di codice mostra come gestire il callback e verificare se l'utente ha concesso le autorizzazioni richieste:

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

Punti chiave sul codice
  • Utilizza l'overload deviceId con il callback onRequestPermissionsResult per assicurarti che lo stato dell'autorizzazione sia mappato correttamente al contesto specifico, ad esempio gli occhiali con display o audio anziché lo smartphone host.
  • La tua app deve gestire correttamente sia i risultati concessi sia quelli negati.