In modalità aereo, i dispositivi possono comunque accedere ad alcuni sensori per abilitare funzionalità specifiche, come la rotazione dello schermo e lo scatto di foto. Android 10 fornisce un'impostazione delle opzioni sviluppatore per disattivare tutti i sensori in un dispositivo. Questa funzionalità aiuta gli sviluppatori a testare la funzionalità della propria app in situazioni in cui tali sensori non sono disponibili e offre inoltre agli utenti un modo per controllare i sensori nel proprio dispositivo.
Quando uno sviluppatore o un utente attiva la disattivazione dei sensori nelle opzioni sviluppatore ( Impostazioni > Sistema > Opzioni sviluppatore > Riquadri sviluppatore Impostazioni rapide ), viene visualizzato un nuovo riquadro nella barra delle impostazioni rapide. Possono utilizzare il riquadro per impedire alle app di accedere alla fotocamera, al microfono e a tutti i sensori gestiti dalla classe SensorManager
.
Avviso: questa opzione riguarda solo le app che accedono ai sensori tramite "SensorService", "CameraService" e "AudioPolicyService". Le funzioni di telefonia non utilizzano "AudioPolicyService" e hanno comunque accesso al microfono durante le telefonate.
Implementazione
Android 10 include un'implementazione di riferimento che gestisce i sensori della fotocamera, del microfono e SensorManager
. Il servizio di sistema che gestisce lo stato disattivato dei sensori e notifica ai client le modifiche di stato si trova in frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
. Il gestore che facilita l'accesso a SensorPrivacyService
nel contesto di un'applicazione si trova in frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Se i tuoi dispositivi utilizzano l'implementazione predefinita di SensorService
, CameraService
e AudioPolicyService
, non è necessaria alcuna personalizzazione aggiuntiva per il progetto di riferimento. Se disponi di altri sensori, consulta Personalizzazione per ulteriori dettagli sul supporto di questa funzionalità.
Problemi comuni
Quando si implementa questa funzionalità, a volte le app della fotocamera non rispondono correttamente ai callback onError
, sia quando si tenta per la prima volta di acquisire la fotocamera sia quando la fotocamera non è più disponibile. Ciò in genere provoca l'arresto anomalo dell'app quando questo riquadro è abilitato, ma può essere utilizzato come segnale per indicare che la funzionalità si sta comportando come previsto.
Questo comportamento indica che l'app non gestisce correttamente il callback onError
in CameraDevice.StateCallback
. Quando Sensori disattivati è abilitato, il callback onError
viene richiamato con CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
impostato come valore di errore. Aggiorna eventuali app originali per gestire la richiamata onError
con questo valore non effettuando chiamate successive a CameraDevice
finché una successiva chiamata openCamera
non ha esito positivo.
Comportamento del sensore
Quando Sensori disattivati è abilitato, i sensori smettono di segnalare dati al sistema o alle app. Un'app può comunque richiedere un sensore e registrare un ascoltatore quando Sensori disattivati è abilitato, ma viene restituito il silenzio per il microfono o la richiamata onSensorChanged
non viene mai richiamata per i sensori. Non appena il riquadro viene disabilitato, gli stessi ascoltatori iniziano a ricevere l'output effettivo dal microfono o i callback previsti a onSensorChanged
senza bisogno di fare alcun lavoro aggiuntivo. Il comportamento predefinito dei sensori silenziati è il seguente.
Telecamera
Se un'app utilizza la fotocamera quando Sensori disattivati è abilitato, viene inviato un errore al metodo di callback onError
e CameraDevice
viene chiuso.
Se un'app tenta di accedere alla fotocamera quando Sensori disattivati è abilitato, viene inviato un errore al metodo di callback onError
.
Microfono
Quando Sensori disattivati è abilitato, l'accesso al microfono è ancora possibile ma viene restituito solo il silenzio. Se un'app utilizza il microfono quando è abilitato l'opzione Sensori disattivati , non viene generato alcun errore, ma la registrazione viene disattivata e restituisce semplicemente una serie di zeri. Se Sensori disattivati è disabilitato mentre l'app sta ancora utilizzando il microfono, vengono restituiti i dati audio previsti.
Se un'app tenta di accedere al microfono quando è attivata l'opzione Sensori disattivati , il microfono restituisce il silenzio.
Sensore
Quando un'app tenta di accedere ad altri sensori quando è abilitata l'opzione Sensori disattivati , il tipo di sensore influenza il comportamento predefinito:
- Sensori continui: i sensori in questa modalità di reporting interrompono l'invio di eventi. Se un'app interagisce con un sensore continuo quando Sensori disattivati è abilitato, il sensore non invia dati aggiuntivi all'app finché la funzionalità non viene disabilitata.
- Eventi di svuotamento: è possibile richiedere uno svuotamento del sensore quando il riquadro è abilitato e viene richiamato il callback
onFlushComplete
per indicare che lo svuotamento richiesto è stato completato correttamente, ma non vengono generati nuovi eventi con i dati del sensore e restituiti al callbackonSensorChanged
. - Eventi di modifica: quando Sensori disattivati è abilitato, non vengono segnalati nuovi eventi di modifica.
- Eventi di attivazione: quando Sensori disattivati è abilitato, gli eventi di attivazione interrompono la generazione. Tutti gli eventi esistenti vengono completati.
Personalizzazione
Se i tuoi dispositivi utilizzano l'implementazione predefinita di SensorService
, CameraService
e AudioPolicyService
, non è necessaria alcuna personalizzazione aggiuntiva per il progetto di riferimento. Tuttavia, puoi supportare i sensori gestiti all'esterno di SensorManager
, rimuovere Sensori disattivati dai tuoi dispositivi o modificare l'interfaccia utente del sistema per i riquadri Impostazioni rapide sviluppatore o l'icona per il riquadro Sensori disattivati .
Supporta più sensori
Se i tuoi dispositivi contengono sensori gestiti all'esterno di SensorManager
, dovresti aggiungerne il supporto utilizzando SensorPrivacyService
e SensorPrivacyManager
.
Quando il riquadro Sensori disattivati viene attivato, SensorPrivacyService
richiama una richiamata unidirezionale per tutti gli ascoltatori registrati. Quando viene ricevuta questa richiamata, l'ascoltatore registrato può intraprendere le azioni necessarie in base allo stato del riquadro. Se è abilitato, tutte le connessioni esistenti possono essere terminate e restituire dati vuoti e un flag impostato per impedire nuove connessioni. Se è disabilitato, il flag può essere reimpostato per consentire nuove connessioni. Utilizzando il servizio fotocamera ( platform/frameworks/av/services/camera/libcameraservice/
) come esempio, seguire questi passaggi per aggiungere il supporto per un nuovo sensore.
- Implementa l'interfaccia
BnSensorPrivacyListener
. Per ulteriori dettagli, vedereSensorPrivacyPolicy
inCameraService.h
. - Registrati con
SensorPrivacyManager
e ottieni lo stato del riquadro all'avvio. Per ulteriori dettagli, consultaSensorPrivacyPolicy::registerSelf
inCameraService.cpp
. - Gestire le modifiche allo stato dei sensori disattivati nella richiamata. Per ulteriori dettagli, consulta
SensorPrivacyPolicy::onSensorPrivacyChanged
eCameraService::blockAllClients
inCameraService.cpp
. - Impedisci l'accesso ai dati del sensore quando il riquadro è abilitato. Per ulteriori dettagli, vedere il controllo delle norme sulla privacy del sensore in
CameraService::validateClientPermissionsLocked
inCameraService.cpp
.
Rimuovere i sensori
Come strumento di sviluppo per i test, Sensori disattivati è nascosto perché un utente deve prima abilitare la modalità sviluppatore, quindi scegliere di rendere il riquadro disponibile nelle impostazioni.
Se non desideri supportare la disattivazione dei sensori sui tuoi dispositivi, rimuovi il tag di servizio da packages/apps/Settings/AndroidManifest.xml
. Se rimuovi il codice di matricola, il riquadro Sensori disattivati non sarà disponibile per l'attivazione dalla pagina dei riquadri Impostazioni rapide per sviluppatori.
Cambia i sensori dall'interfaccia utente
Sono due gli elementi che possono essere personalizzati per l'interfaccia utente Sensori spenti : l'icona visualizzata per il riquadro delle impostazioni rapide dello sviluppatore e l'icona visualizzata nella barra di stato quando il riquadro è abilitato. Per personalizzare l'aspetto di queste icone, sostituisci questi file:
- Icona del riquadro Impostazioni rapide:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- Icona sulla barra di stato:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Validazione
Essendo uno strumento di sviluppo opzionale, non sono previsti test CTS per questa funzionalità.
Puoi testare manualmente installando un'app da Google Play che legge e visualizza tutti i sensori del dispositivo. Quando abiliti il riquadro Sensori disattivati , assicurati che nessuno dei valori per i sensori cambi, che l'audio del microfono sia silenzioso e che la fotocamera non sia accessibile.