To pytanie niepokoi mnie od dłuższego czasu. Więc teraz w końcu postanowiłem przejść do sedna problemu.
Playstore ma aplikację o nazwie uprawnienie READ_PHONE_STATE , która żąda READ_PHONE_STATE
jako jedyne uprawnienie i nie robi nic poza drukowaniem wszystkich danych, do których może uzyskiwać dostęp przy użyciu lub bez niego. Zainstalowałem to na moim LG Optimus 4X , będąc zrootowanym na standardowym Androidzie 4.0.3, i cofnąłem uprawnienia za pomocą LBE. Wyniki są dość interesujące, jak pokazują poniższe zrzuty ekranu:
Informacje zebrane za zgodą aplikacji.READ_PHONE_STATE (kliknij zdjęcia, aby wyświetlić większe warianty)
Jak łatwo zauważyć, nawet niektóre informacje, które były niedostępne bez pozwolenia, były ogólnodostępne: mój numer skrzynki pocztowej (uwaga: tak, to jest poprawny; z moim dostawcą jest skrótem podczas wybierania z twojego urządzenia, więc mogę dowolnie go wyświetlaj;) Na końcu pierwszego zrzutu ekranu zobaczysz:
CALL_STATE_IDLE
. Dlatego nie ma połączeń przychodzących, wychodzących ani w toku. Żadna aplikacja nie potrzebuje tego uprawnienia do „tła” podczas połączeń przychodzących.
Możliwe jest nawet sprawdzenie, czy dane mobilne są aktywne ( DATA_DISCONNECTED
podczas robienia zrzutów ekranu korzystałem z Wi-Fi, jak widać na pasku powiadomień), w jakim kraju jesteś, dostawcy (w tym niektórych danych technicznych na jego temat), czy masz kartę SIM lub korzystasz z roamingu.
Stąd nie są dostępne tylko dane identyfikujące: IMEI, SIMID, IMSI i własny numer telefonu.
Wniosek: Zezwolenie to jest potrzebne tylko do celów identyfikacyjnych, nic więcej.
Dlaczego więc tak wiele aplikacji tego potrzebuje?
- W przypadku modułów reklamowych najprawdopodobniej 1
- Ponieważ deweloper myślał, że go potrzebuje (jak wskazano tutaj w niektórych odpowiedziach) 2
- Ponieważ aplikacja jest przeznaczona (również) do uruchamiania na Androidzie 1.5 i nowszych (łatwo to sprawdzić, ponieważ jest to wymienione w Google Play ).
Prawdopodobieństwa w dokładnie tej kolejności, IMHO.
1 Uwaga posta Dana na czacie :
Zasady Google Play zabraniają teraz aplikacjom uzyskiwania identyfikatora IMEI do celów reklamowych. Wszystkie biblioteki reklam zostały zaktualizowane, aby używały „identyfikatora reklamowego” dostarczonego przez Google Play, więc wszelkie, które nadal używają IMEI w tym celu, powinny zostać zgłoszone Google.
Ponieważ użytkownikowi trudno jest powiedzieć, do czego aplikacja używa IMEI, należy najpierw poprosić programistę o wyjaśnienie.
2 Inny programista właśnie wskazał mi subtelną różnicę: chociaż pozwolenie nie jest potrzebne do odczytania aktualnego stanu połączenia (jak już wskazałem), może być konieczne zarejestrowanie słuchacza , aby otrzymywać powiadomienia o zmianach połączenia status (patrz: Wykrywanie przychodzących i wychodzących połączeń telefonicznych na Androidzie ). Chociaż wydaje się, że istnieją sposoby, aby poradzić sobie z tym automatycznie podczas wywoływania systemu onPause
, może nie zawsze być odpowiednie: pomyśl o swoim budziku. Może nie być konieczne automatyczne zatrzymanie tego połączenia przychodzącego - szczególnie nie wtedy, gdy w profilu ustawiono „wyciszenie” głośności dzwonka.
3 Ponownie poprawka od Dana : Domyślne dodatkowe pozwolenie otrzymasz tylko wtedy, gdy „docelowa” wersja aplikacji to 1.5. Jeśli celujesz w późniejszą wersję, ale twoja minimalna wersja to 1.5, nie otrzymasz automatycznie dodanego pozwolenia.
Aktualizacje
- Ciekawe, że istnieje otwarty problem (21504) do podziału
READ_PHONE_STATE
na to, co jest potrzebne, aby a) wykryć połączenia przychodzące i powiązane (telefonia), a także drugie pozwolenie na dane identyfikacyjne (IMEI, IMSI itp.). Otwarty 11/2011, wciąż nie pracował. Oznacz to gwiazdką, jeśli jesteś zainteresowany
- I tak, istnieje sposób, aby osiągnąć ten sam (wykrywanie przychodzące) bez tej
READ_PHONE_STATE
zgody, jak np podkreślił Arno Welzel . Jak przychodzące połączenie telefoniczne spowodowałaby dzwonek, że zdarzenie może być stosowany z onAudioFocusChange()
, który nie wymaga żadnego specjalnego pozwolenia: jeśli wywołany przez to, że aplikacja będzie mogła sprawdzić CallState (ponownie, bez specjalnego zezwolenia wymagane), aby zobaczyć, czy jest tam połączenie przychodzące.