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
- Creiamo un
ActivityResultLauncherutilizzando il metodoProjectedPermissionsResultContract(). Il callback riceve una mappa dei nomi delle autorizzazioni e del loro stato di concessione. - La funzione
requestAudioPermission()crea un oggettoProjectedPermissionsRequestParams. Questo oggetto raggruppa l'elenco delle autorizzazioni di cui abbiamo bisogno e la motivazione rivolta agli utenti. - La chiamata di
launch()sul launcher attiva il flusso utente di richiesta di autorizzazione. - La tua app deve gestire correttamente i risultati concessi e negati nel callback del launcher.
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:
Sugli occhiali AI: un'attività viene visualizzata sul dispositivo proiettato (occhiali), che invita l'utente a guardare lo smartphone per continuare.
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.
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.
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
ActivityResultLaunchercon una mappa contenente lo stato concesso per ogni autorizzazione richiesta.