W trybie samolotowym urządzenia nadal mają dostęp do niektórych czujników, aby umożliwić korzystanie z określonych funkcji, takich jak obracanie ekranu i robienie zdjęć. W systemie Android 10 dostępne jest ustawienie opcji programistycznych umożliwiające wyłączenie wszystkich czujników w urządzeniu. Ta funkcja pomaga programistom testować funkcjonalność aplikacji w sytuacjach, gdy te czujniki stają się niedostępne, a także umożliwia użytkownikom kontrolowanie czujników w ich urządzeniu.
Gdy programista lub użytkownik włączy opcję Czujniki wyłączone w opcjach programisty ( Ustawienia > System > Opcje programisty > Kafelki programisty szybkich ustawień ), na pasku szybkich ustawień pojawi się nowy kafelek. Mogą użyć kafelka, aby uniemożliwić aplikacjom dostęp do kamery, mikrofonu i wszystkich czujników zarządzanych przez klasę SensorManager
.
Ostrzeżenie: ta opcja dotyczy tylko aplikacji, które uzyskują dostęp do czujników poprzez „SensorService”, „CameraService” i „AudioPolicyService”. Funkcje telefoniczne nie korzystają z usługi `AudioPolicyService` i nadal mają dostęp do mikrofonu podczas rozmów telefonicznych.
Realizacja
Android 10 zawiera referencyjną implementację, która obsługuje kamerę, mikrofon i czujniki SensorManager
. Usługa systemowa zarządzająca stanem wyłączenia czujników i powiadamiająca klientów o zmianach stanu znajduje się w frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
. Menedżer ułatwiający dostęp do SensorPrivacyService
w kontekście aplikacji znajduje się w frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Jeśli Twoje urządzenia korzystają z domyślnej implementacji SensorService
, CameraService
i AudioPolicyService
, nie jest potrzebne żadne dodatkowe dostosowywanie projektu referencyjnego. Jeśli masz inne czujniki, zobacz Dostosowywanie , aby uzyskać więcej informacji na temat obsługi tej funkcji.
Powszechne problemy
Podczas implementowania tej funkcji czasami aplikacje aparatu nie reagują prawidłowo na wywołania zwrotne onError
, zarówno przy pierwszej próbie uzyskania dostępu do aparatu, jak i wtedy, gdy aparat nie jest już dostępny. Zwykle powoduje to awarię aplikacji, gdy ten kafelek jest włączony, ale można to wykorzystać jako sygnał wskazujący, że funkcja działa zgodnie z oczekiwaniami.
To zachowanie wskazuje, że aplikacja nie obsługuje poprawnie wywołania zwrotnego onError
w CameraDevice.StateCallback
. Gdy opcja Sensors off jest włączona, wywoływane jest wywołanie zwrotne onError
z ustawioną wartością błędu CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
. Zaktualizuj wszystkie aplikacje własne, aby obsługiwały wywołanie zwrotne onError
przy użyciu tej wartości, nie wykonując żadnych kolejnych wywołań względem CameraDevice
, dopóki kolejne wywołanie openCamera
nie zakończy się pomyślnie.
Zachowanie czujnika
Gdy włączona jest opcja Czujniki wyłączone , czujniki przestają raportować jakiekolwiek dane do systemu lub aplikacji. Aplikacja może nadal żądać czujnika i rejestrować słuchacza, gdy włączona jest opcja Czujniki wyłączone , ale albo zwracana jest cisza dla mikrofonu, albo wywołanie zwrotne onSensorChanged
nigdy nie jest wywoływane dla czujników. Gdy tylko kafelek zostanie wyłączony, ci sami słuchacze zaczną odbierać rzeczywisty sygnał wyjściowy z mikrofonu lub oczekiwane wywołania zwrotne do onSensorChanged
bez konieczności wykonywania dodatkowej pracy. Domyślne zachowanie wyciszonych czujników jest następujące.
Kamera
Jeśli aplikacja korzysta z kamery, gdy włączona jest opcja Sensors off , do metody wywołania zwrotnego onError
zostanie wysłany błąd, a CameraDevice
zostanie zamknięta.
Jeśli aplikacja spróbuje uzyskać dostęp do kamery, gdy włączona jest opcja Czujniki wyłączone , do metody wywołania zwrotnego onError
zostanie wysłany błąd.
Mikrofon
Gdy opcja Czujniki wyłączone jest włączona, dostęp do mikrofonu jest nadal możliwy, ale zwracana jest jedynie cisza. Jeśli aplikacja korzysta z mikrofonu, gdy włączona jest opcja Czujniki wyłączone , nie jest generowany żaden błąd, ale nagrywanie jest wyciszane i zwraca jedynie tablicę zer. Jeśli opcja Czujniki wyłączone jest wyłączona, gdy aplikacja nadal korzysta z mikrofonu, zwracane są oczekiwane dane audio.
Jeśli aplikacja spróbuje uzyskać dostęp do mikrofonu, gdy włączona jest opcja Czujniki wyłączone , mikrofon wyciszy się.
Czujnik
Gdy aplikacja próbuje uzyskać dostęp do innych czujników, gdy włączona jest opcja Czujniki wyłączone , typ czujnika wpływa na zachowanie domyślne:
- Czujniki ciągłe: czujniki w tym trybie raportowania przestają wysyłać zdarzenia. Jeśli aplikacja współpracuje z czujnikiem ciągłym, gdy włączona jest opcja Czujniki wyłączone , czujnik nie wysyła żadnych dodatkowych danych do aplikacji, dopóki funkcja nie zostanie wyłączona.
- Zdarzenia Flush: można zażądać płukania czujnika, gdy kafelek jest włączony i wywołane zostanie wywołanie zwrotne
onFlushComplete
w celu wskazania, że żądane płukanie zakończyło się pomyślnie, ale nie są generowane żadne nowe zdarzenia z danymi czujnika i zwracane do wywołania zwrotnegoonSensorChanged
. - Zdarzenia przy zmianie: gdy włączona jest opcja Czujniki wyłączone, nie są zgłaszane żadne nowe zdarzenia zmiany.
- Zdarzenia wyzwalające: gdy włączona jest opcja Czujniki wyłączone, zdarzenia wyzwalające przestają być generowane. Wszystkie istniejące wydarzenia zostały zakończone.
Dostosowywanie
Jeśli Twoje urządzenia korzystają z domyślnej implementacji SensorService
, CameraService
i AudioPolicyService
, nie jest potrzebne żadne dodatkowe dostosowywanie projektu referencyjnego. Możesz jednak obsługiwać czujniki zarządzane poza SensorManager
, usuwać czujniki ze swoich urządzeń lub zmieniać interfejs systemowy dla kafelków szybkich ustawień programisty lub ikony kafelka Sensory wyłączone .
Obsługuj więcej czujników
Jeśli Twoje urządzenia zawierają czujniki zarządzane poza SensorManager
, powinieneś dodać dla nich obsługę za pomocą SensorPrivacyService
i SensorPrivacyManager
.
Kiedy kafelek Sensors off jest przełączony, SensorPrivacyService
wywołuje jednokierunkowe wywołanie zwrotne dla wszystkich zarejestrowanych słuchaczy. Po odebraniu tego wywołania zwrotnego zarejestrowany słuchacz może podjąć niezbędne kroki w zależności od stanu kafelka. Jeśli jest włączona, wszystkie istniejące połączenia mogą zostać zakończone i zwrócone puste dane oraz ustawiona flaga zapobiegająca nowym połączeniom. Jeśli jest wyłączona, flagę można zresetować, aby umożliwić nowe połączenia. Korzystając z usługi kamery ( platform/frameworks/av/services/camera/libcameraservice/
) jako przykładu, wykonaj poniższe kroki, aby dodać obsługę nowego czujnika.
- Zaimplementuj interfejs
BnSensorPrivacyListener
. Aby uzyskać więcej informacji, zobaczSensorPrivacyPolicy
wCameraService.h
. - Zarejestruj się w
SensorPrivacyManager
i uzyskaj stan kafelka przy uruchomieniu. Aby uzyskać więcej informacji, zobaczSensorPrivacyPolicy::registerSelf
wCameraService.cpp
. - Obsługuj zmiany stanu czujników wyłączonych w wywołaniu zwrotnym. Aby uzyskać więcej informacji, zobacz
SensorPrivacyPolicy::onSensorPrivacyChanged
iCameraService::blockAllClients
wCameraService.cpp
. - Zapobiegaj dostępowi do danych czujnika, gdy kafelek jest włączony. Aby uzyskać więcej informacji, zobacz politykę prywatności czujnika w
CameraService::validateClientPermissionsLocked
wCameraService.cpp
.
Usuń czujniki wyłączone
Jako narzędzie programistyczne do testowania, Czujniki wyłączone są ukryte, ponieważ użytkownik musi najpierw włączyć tryb programisty, a następnie zdecydować się na udostępnienie kafelka w ustawieniach.
Jeśli nie chcesz obsługiwać czujników na swoich urządzeniach, usuń znacznik serwisowy z packages/apps/Settings/AndroidManifest.xml
. Jeśli usuniesz znacznik serwisowy, nie będzie można włączyć kafelka Czujniki wyłączone na stronie kafelków szybkich ustawień programisty.
Zmień interfejs czujników wyłączonych
Istnieją dwa elementy, które można dostosować w interfejsie użytkownika Czujniki wyłączone : ikona wyświetlana na kafelku szybkich ustawień programisty oraz ikona wyświetlana na pasku stanu, gdy kafelek jest włączony. Aby dostosować wygląd tych ikon, zastąp te pliki:
- Ikona kafelka szybkich ustawień:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- Ikona paska stanu:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Walidacja
Jako opcjonalne narzędzie programistyczne, nie ma testów CTS dla tej funkcji.
Możesz przetestować ręcznie, instalując aplikację z Google Play, która odczytuje i wyświetla wszystkie czujniki urządzenia. Po włączeniu kafelka Czujniki wyłączone upewnij się, że żadna z wartości czujników nie uległa zmianie, dźwięk mikrofonu jest cichy, a kamera nie jest dostępna.