W trybie samolotowym urządzenia mogą nadal korzystać z niektórych czujników, aby umożliwić korzystanie z określonych funkcji, takich jak obracanie ekranu i robienie zdjęć. Android 10 udostępnia opcję w ustawieniach dla programistów, która pozwala wyłączyć wszystkie czujniki na urządzeniu. Ta funkcja pomaga deweloperom testować działanie aplikacji w sytuacjach, gdy czujniki są niedostępne. Umożliwia też użytkownikom sterowanie czujnikami na urządzeniu.
Gdy deweloper lub użytkownik włączy opcję Wyłącz czujniki w opcjach dla programistów (Ustawienia > System > Opcje programisty > Kafelki szybkich ustawień dla programisty), nowy kafelek pojawi się na pasku szybkich ustawień. Mogą używać tej funkcji, aby uniemożliwić aplikacjom dostęp do kamery, mikrofonu i wszystkich czujników zarządzanych przez klasę SensorManager
.
Ostrzeżenie: ta opcja ma wpływ tylko na aplikacje, które uzyskują dostęp do czujników za pomocą usług SensorService, CameraService i AudioPolicyService. Funkcje telefoniczne nie korzystają z usługi AudioPolicyService i nadal mają dostęp do mikrofonu podczas połączeń telefonicznych.
Implementacja
Android 10 zawiera implementację referencyjną, która obsługuje kamerę, mikrofon i czujniki SensorManager
. Usługa systemowa, która zarządza stanem Czujniki wyłączone i powiadamia klientów o zmianach stanu, znajduje się w frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
.
Menedżer, który umożliwia dostęp do SensorPrivacyService
w kontekście aplikacji, znajduje się w sekcji frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Jeśli Twoje urządzenia korzystają z domyślnej implementacji SensorService
,
CameraService
i AudioPolicyService
, nie musisz wprowadzać żadnych dodatkowych zmian w projektie referencyjnym. Jeśli masz inne czujniki, więcej informacji o obsługiwaniu tej funkcji znajdziesz w sekcji Personalizacja.
Typowe problemy
Podczas wdrażania tej funkcji aplikacje aparatu nie zawsze prawidłowo reagują na wywołania zwrotne onError
, zarówno podczas pierwszego próby uzyskania dostępu do aparatu, jak i gdy aparat jest już niedostępny. Zazwyczaj powoduje to awarię aplikacji po włączeniu tej funkcji, ale może też służyć jako sygnał wskazujący, że funkcja działa zgodnie z oczekiwaniami.
Takie zachowanie wskazuje, że aplikacja nie obsługuje prawidłowo wywołania zwrotnego onError
w funkcji CameraDevice.StateCallback
. Gdy włączona jest opcja Wyłączenie czujników, wywołanie zwrotne onError
jest wywoływane z wartością błędu CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
. Zaktualizuj aplikacje własne, aby obsługiwały wywołanie zwrotne onError
z tą wartością, nie wykonując żadnych kolejnych wywołań do CameraDevice
, dopóki kolejne wywołanie openCamera
nie zakończy się powodzeniem.
Działanie czujników
Gdy włączysz opcję Czujniki wyłączone, czujniki przestaną przesyłać dane do systemu i aplikacji. Aplikacja może nadal prosić o użycie czujnika i rejestrować listenera, gdy włączona jest opcja Czujniki wyłączone, ale albo z mikrofonu zwracany jest cichy sygnał, albo wywołanie onSensorChanged
nigdy nie jest wywoływane w przypadku czujników. Gdy tylko kafelek zostanie wyłączony, te same urządzenia zaczną odbierać rzeczywiste dane z mikrofonu lub oczekiwane wywołania zwrotne do onSensorChanged
bez konieczności wykonywania dodatkowych czynności. Domyślne działanie wyciszonych czujników:
Aparat
Jeśli aplikacja używa aparatu, gdy włączona jest opcja Czujniki wyłączone,
do metody wywołania onError
wysyłany jest błąd, a CameraDevice
jest zamykany.
Jeśli aplikacja próbuje uzyskać dostęp do kamery, gdy włączona jest opcja Czujniki wyłączone, do metody wywołania onError
wysyłany jest błąd.
mikrofon
Gdy włączona jest opcja Czujniki wyłączone, dostęp do mikrofonu jest nadal możliwy, ale zwracane są tylko dźwięki ciszy. Jeśli aplikacja używa mikrofonu, gdy włączona jest opcja Wyłączone czujniki, nie generuje to błędu, ale nagrywanie jest wyciszone i zwraca tablicę zer. Jeśli opcja Czujniki wyłączone jest wyłączona, a aplikacja nadal korzysta z mikrofonu, zwracane są oczekiwane dane audio.
Jeśli aplikacja próbuje uzyskać dostęp do mikrofonu, gdy włączona jest opcja Wyłączone czujniki, mikrofon nie rejestruje dźwięku.
Czujnik
Gdy aplikacja próbuje uzyskać dostęp do innych czujników, gdy opcja Czujniki wyłączone jest włączona, typ czujnika wpływa na domyślne działanie:
- Ciągłe czujniki: w tym trybie raportowania czujniki przestają wysyłać zdarzenia. Jeśli aplikacja wchodzi w interakcję z czujnikiem ciągłym, gdy włączona jest opcja Czujniki wyłączone, czujnik nie wysyła żadnych dodatkowych danych do aplikacji, dopóki ta funkcja nie zostanie wyłączona.
- Wyczyszczanie zdarzeń: można poprosić o wyczyszczenie czujnika, gdy kafelek jest włączony, a wywołanie zwrotne
onFlushComplete
wskazuje, że żądane czyszczenie zostało zakończone pomyślnie, ale żadne nowe zdarzenia z danymi z czujnika nie zostały wygenerowane i zwrócone do wywołania zwrotnegoonSensorChanged
. - Zdarzenia zmiany: gdy włączona jest opcja Czujniki wyłączone, nie są raportowane żadne nowe zdarzenia zmiany.
- Zdarzenia uruchamiające: gdy włączone jest ustawienie Wyłączenie czujników, zdarzenia uruchamiające przestają się generować. wszystkie istniejące zdarzenia są zakończone;
Dostosowywanie
Jeśli Twoje urządzenia korzystają z domyślnej implementacji SensorService
, CameraService
i AudioPolicyService
, nie musisz wprowadzać żadnych dodatkowych zmian w projekcie referencyjnym. Możesz jednak obsługiwać czujniki zarządzane poza SensorManager
, usunąć Wyłączone czujniki z urządzeń lub zmienić interfejs systemowy dla szybkich ustawień dla deweloperów lub ikonę Wyłączone czujniki.
Obsługa większej liczby czujników
Jeśli Twoje urządzenia zawierają czujniki zarządzane poza SensorManager
,
dodaj obsługę tych czujników za pomocą SensorPrivacyService
i
SensorPrivacyManager
.
Gdy włączysz kafelek Czujniki wyłączone,
SensorPrivacyService
wywoła to jednokierunkowe wywołanie zwrotne dla wszystkich zarejestrowanych
odbiorców. Gdy otrzymasz to wywołanie zwrotne, zarejestrowany odbiorca może podjąć odpowiednie działania w zależności od stanu kafelka. Jeśli jest włączona, wszystkie istniejące połączenia mogą zostać zakończone i zwracać puste dane, a flaga ustawiona na zapobieganie nowym połączeniom. Jeśli jest wyłączona, można zresetować flagę, aby zezwolić na nowe połączenia. Aby dodać obsługę nowego czujnika, wykonaj te czynności, korzystając na przykład z usługi aparatu (platform/frameworks/av/services/camera/libcameraservice/
).
- Zaimplementuj interfejs
BnSensorPrivacyListener
. Więcej informacji znajdziesz w sekcjiSensorPrivacyPolicy
wCameraService.h
. - Zarejestruj się w
SensorPrivacyManager
i uzyskaj stan kafelka podczas uruchamiania. Więcej informacji znajdziesz w sekcjiSensorPrivacyPolicy::registerSelf
w dokumentacjiCameraService.cpp
. - W zgłoszeniu zwrotnym obsłuż zmiany stanu Sensors off. Więcej informacji znajdziesz w artykułach
SensorPrivacyPolicy::onSensorPrivacyChanged
iCameraService::blockAllClients
w sekcjiCameraService.cpp
. - Zapobieganie dostępowi do danych z czujnika, gdy kafelek jest włączony. Więcej informacji znajdziesz w kontroli zgodności z polityką prywatności czujników w
CameraService::validateClientPermissionsLocked
wCameraService.cpp
.
Usuń Wyłącz czujniki
Jako narzędzie dla programistów do testowania Czujniki wyłączone jest ukryte, ponieważ użytkownik musi najpierw włączyć tryb programisty, a następnie zdecydować się na udostępnienie tej funkcji w ustawieniach.
Jeśli nie chcesz korzystać z opcji Wyłącz czujniki na swoich urządzeniach, usuń tag serwisowy z packages/apps/Settings/AndroidManifest.xml
. Jeśli usuniesz tag usługi, nie będzie można włączyć kafelka Czujniki wyłączone na stronie kafelków szybkich ustawień dla programistów.
Zmiana interfejsu Wyłącz czujniki
W interfejsie Wyłączone czujniki można dostosować 2 elementy: ikonę wyświetlaną na kafelku Szybkie ustawienia dla deweloperów oraz ikonę wyświetlaną na pasku stanu, gdy klawisz jest włączony. Aby dostosować wygląd tych ikon, zastąp te pliki:
- Ikona kafelka Szybkie ustawienia:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- Ikona na pasku stanu:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Weryfikacja
To opcjonalne narzędzie dla deweloperów, dlatego nie ma testów CTS dla tej funkcji.
Możesz przeprowadzić test ręcznie, instalując z Google Play aplikację, która odczytuje i wyświetli wszystkie czujniki urządzenia. Gdy włączysz kafelek Czujniki wyłączone, upewnij się, że żadna z wartości czujników się nie zmieniła, mikrofon nie wydaje dźwięku, a kamera jest niedostępna.