Come su uno smartphone, l'accesso all'hardware sensibile, come la fotocamera e il microfono degli occhiali audio e 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 ha già le autorizzazioni corrispondenti sullo smartphone.
Dichiarare 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 uno smartphone o per una funzionalità specifica 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 delle autorizzazioni per assicurarti di offrire la migliore esperienza ai tuoi 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 le autorizzazioni specifiche per gli occhiali.
Scenari di autorizzazione
Esistono diversi scenari che potresti incontrare quando richiedi autorizzazioni di runtime pericolose su occhiali audio e display:
- Richiedi autorizzazioni di runtime da un'attività proiettata
- Richiedi autorizzazioni di runtime da un'attività dello smartphone
Per i dettagli su ogni scenario, consulta le sezioni seguenti di questa guida.
Richiedere e gestire le autorizzazioni di runtime da un'attività proiettata
Per richiedere le autorizzazioni per gli occhiali audio e gli occhiali con display, utilizza prima il
ActivityResultLauncher con il
ProjectedPermissionsResultContract metodo per registrare il launcher delle autorizzazioni. Quando l'utente ha agito sulla richiesta di autorizzazione, il callback riceve una mappa dei nomi delle autorizzazioni e del relativo stato di concessione.
// 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 } }
Punti chiave sul codice
- Devi specificare le autorizzazioni richieste dalla tua app, ad esempio
Manifest.permission.CAMERAoManifest.permission.RECORD_AUDIO. - La tua app deve gestire correttamente sia i risultati concessi sia quelli negati nel callback del launcher.
Per attivare il flusso di richiesta di autorizzazione, passa un elenco di
ProjectedPermissionsRequestParams al
metodo launch del launcher delle autorizzazioni registrato. L'oggetto ProjectedPermissionsRequestParams raggruppa le autorizzazioni del file manifest richieste insieme a una stringa rationale personalizzata. La stringa rationale deve spiegare in modo chiaro e conciso perché l'app richiede l'accesso alle funzionalità hardware degli occhiali (ad esempio la fotocamera o il microfono).
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)) }
Punti chiave sul codice
- La chiamata di
launchsul launcher attiva il flusso utente di richiesta di autorizzazione permission request user flow.
Comprendere il flusso utente di richiesta di autorizzazione
Quando avvii una richiesta di autorizzazione utilizzando il
ProjectedPermissionsResultContract metodo, il sistema avvia un
flusso utente coordinato sia sugli occhiali sia sullo smartphone.
Durante il flusso utente delle autorizzazioni, ecco cosa possono aspettarsi la tua app e l'utente:
Sugli occhiali: sul dispositivo proiettato (occhiali) viene visualizzata un'attività che chiede all'utente di guardare lo smartphone per continuare.
Sullo smartphone: contemporaneamente, sul dispositivo host (smartphone) viene avviata un'attività. Questa schermata mostra la stringa di motivazione che hai fornito e offre all'utente la possibilità di procedere o annullare.
Sullo smartphone: se l'utente accetta la motivazione, sullo smartphone viene visualizzata una finestra di dialogo delle autorizzazioni di sistema Android modificata che informa l'utente che sta concedendo l'autorizzazione per gli occhiali (non per lo smartphone) e l'utente può concedere o negare formalmente l'autorizzazione.
Ricezione del risultato: dopo che l'utente ha fatto la sua scelta finale, le attività sia sullo smartphone sia sugli occhiali vengono chiuse. Viene quindi chiamato il
ActivityResultLaunchercallback con una mappa contenente lo stato di concessione per ogni autorizzazione richiesta.
Richiedere autorizzazioni di runtime in un'attività dello smartphone
Se la tua app è in esecuzione in un'attività dello smartphone, ma richiede autorizzazioni per occhiali audio o occhiali con display, ad esempio per consentire a un utente di passare uno stream video alla fotocamera degli occhiali per un punto di vista in prima persona, richiedi le autorizzazioni utilizzando il metodo Activity#requestPermissions(permissions, requestCode,
deviceId) specifico per il dispositivo.
Per scegliere come target gli occhiali audio e display, ottieni l'ID dispositivo appropriato chiamando
getDeviceId in un contesto di dispositivo proiettato. Passa questo ID quando richiedi le autorizzazioni dall'attività dello smartphone, come mostrato nell'esempio seguente:
// 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 )
Gestire i risultati delle autorizzazioni
Una volta che l'utente risponde alla finestra di dialogo delle autorizzazioni sullo smartphone, la sua decisione viene inviata alla tua app chiamando il callback onRequestPermissionsResult.
Per gestire la risposta, esegui l'override di onRequestPermissionsResult all'interno dell'
Activity istanza 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:
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 } } }
Punti chiave sul codice
- Utilizza l'overload
deviceIdcon il callbackonRequestPermissionsResultper assicurarti che lo stato dell'autorizzazione sia mappato correttamente al contesto specifico, ad esempio gli occhiali audio o display anziché lo smartphone host. - La tua app deve gestire correttamente sia i risultati concessi sia quelli negati.