Richiedere le autorizzazioni hardware per gli occhiali AI

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
AI Glasses

Proprio come su uno smartphone, l'accesso a hardware sensibile come la fotocamera e il microfono degli occhiali AI 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.

Segui questa guida per:

  • Dichiarare le autorizzazioni nel manifest dell'app
  • Richiedi autorizzazioni
  • Scopri di più sul flusso utente delle autorizzazioni

Dichiarare le autorizzazioni nel 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 riguardi una funzionalità specifica per smartphone o occhiali AI, ma devi comunque richiederla esplicitamente per l'hardware o la funzionalità specifica per gli occhiali.

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for the microphone. -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <application ...>
        ...
    </application>
</manifest>

Richiedi autorizzazioni

Per richiedere le autorizzazioni per gli occhiali AI, utilizza ActivityResultLauncher con il metodo ProjectedPermissionsResultContract(). Devi specificare le autorizzazioni richieste dalla tua app, ad esempio Manifest.permission.CAMERA o Manifest.permission.RECORD_AUDIO. Fornisci una motivazione chiara e concisa che spieghi perché la tua app ha bisogno di queste autorizzazioni. Questa motivazione viene mostrata all'utente per aiutarlo a prendere una decisione consapevole.

class SampleGlassesActivity : ComponentActivity() {

  // Register the permissions launcher
    private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
        registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
            // Check the result for the specific RECORD_AUDIO permission
            if (results[Manifest.permission.RECORD_AUDIO] == true) {
                onPermissionGranted()
            } else {
                onPermissionDenied()
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Audio permission is critical for the displayless AI glasses experience
        checkAndRequestAudioPermission()

        setContent {
            GlimmerTheme {
                DisplayGlassesUi()
            }
        }
    }

    // Checks for the required RECORD_AUDIO permission and requests it if necessary.

    private fun checkAndRequestAudioPermission() {
        val permission = Manifest.permission.RECORD_AUDIO
        val permissionStatus = ContextCompat.checkSelfPermission(this, permission)

        if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
            // Permission is already granted
            onPermissionGranted()
        } else {
            // Permission is not granted, request it
            requestAudioPermission()
        }
    }

    private fun requestAudioPermission() {
        val params = ProjectedPermissionsRequestParams(
                        permissions = listOf(Manifest.permission.RECORD_AUDIO),
            // The rationale should explain why this permission is needed.
            // For displayless AI glasses, it's often the main input mechanism.
            rationale = "Microphone access is essential for voice commands and features on these AI glasses."
        )
        requestPermissionLauncher.launch(listOf(params))
    }

    private fun onPermissionGranted() {
        // Implement the logic for when the permission is granted

    }

    private fun onPermissionDenied() {
        // Implement the logic for when the permission is denied.
        // On displayless AI glasses, if the app requires voice/mic it should exit the activity if the critical permission is denied.
        finish()
    }
}

Punti chiave sul codice

Comprendere il flusso utente della richiesta di autorizzazione

Quando avvii una richiesta di autorizzazione utilizzando il metodo ProjectedPermissionsResultContract(), il sistema avvia un flusso utente coordinato sia sugli occhiali AI sia sullo smartphone.

Durante il flusso utente delle autorizzazioni, ecco cosa possono aspettarsi la tua app e l'utente:

  1. Sugli occhiali AI: un'attività viene visualizzata sul dispositivo proiettato (occhiali), che invita l'utente a guardare lo smartphone per continuare.

  2. Sullo smartphone: contemporaneamente, un'attività viene avviata sul dispositivo host (smartphone). Questa schermata mostra la stringa di motivazione che hai fornito e offre all'utente la possibilità di procedere o annullare.

  3. Sul telefono: se l'utente accetta la motivazione, sullo smartphone viene visualizzata una finestra di dialogo modificata delle autorizzazioni di sistema Android che informa l'utente che sta concedendo l'autorizzazione per il dispositivo occhiali AI (non per lo smartphone) e l'utente può concedere o negare formalmente l'autorizzazione.

  4. Ricezione del risultato: dopo che l'utente ha fatto la sua scelta finale, le attività sia sullo smartphone sia sugli occhiali AI vengono chiuse. Viene quindi richiamato il callback ActivityResultLauncher con una mappa contenente lo stato concesso per ogni autorizzazione richiesta.