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.
- Sugli occhiali: il sistema apre un'attività companion proiettata sugli occhiali, invitando l'utente a controllare lo smartphone per rispondere alla richiesta di autorizzazione.
- 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.requestPermissionsanziché il metodo standardActivityCompat. 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
deviceIdcon il callbackonRequestPermissionsResultper 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 metodorequestPermissions.
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
deviceIdcon il callbackonRequestPermissionsResultper 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.