Czujniki wyłączone

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

  1. Zaimplementuj interfejs BnSensorPrivacyListener . Aby uzyskać więcej informacji, zobacz SensorPrivacyPolicy w CameraService.h .
  2. Zarejestruj się w SensorPrivacyManager i uzyskaj stan kafelka przy uruchomieniu. Aby uzyskać więcej informacji, zobacz SensorPrivacyPolicy::registerSelf w CameraService.cpp .
  3. Obsługuj zmiany stanu czujników wyłączonych w wywołaniu zwrotnym. Aby uzyskać więcej informacji, zobacz SensorPrivacyPolicy::onSensorPrivacyChanged i CameraService::blockAllClients w CameraService.cpp .
  4. Zapobiegaj dostępowi do danych czujnika, gdy kafelek jest włączony. Aby uzyskać więcej informacji, zobacz politykę prywatności czujnika w CameraService::validateClientPermissionsLocked w CameraService.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.