Sensori spenti

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 callback onSensorChanged .
  • 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.

  1. Implementa l'interfaccia BnSensorPrivacyListener . Per ulteriori dettagli, vedere SensorPrivacyPolicy in CameraService.h .
  2. Registrati con SensorPrivacyManager e ottieni lo stato del riquadro all'avvio. Per ulteriori dettagli, consulta SensorPrivacyPolicy::registerSelf in CameraService.cpp .
  3. Gestire le modifiche allo stato dei sensori disattivati ​​nella richiamata. Per ulteriori dettagli, consulta SensorPrivacyPolicy::onSensorPrivacyChanged e CameraService::blockAllClients in CameraService.cpp .
  4. 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 in CameraService.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.