Этот вопрос беспокоит меня довольно давно. Так что теперь, наконец, я решил докопаться до сути вопроса.
Playstore есть приложение под названием permission.READ_PHONE_STATE , который запрашивает в READ_PHONE_STATE
качестве единственного разрешения, и ничего не делает , чем печать всех данных , которые он может получить доступ с или без его использования. Я установил его на свой LG Optimus 4X , имея рут-версию на Android 4.0.3, и отозвал разрешение с помощью LBE. Результаты довольно интересные, как показывают следующие скриншоты:
Информация, собранная с разрешения приложения. READ_PHONE_STATE (щелкните изображения, чтобы увеличить варианты)
Как вы можете легко видеть, даже некоторая информация, которую разработчик, хотя и был недоступен без разрешения, была в свободном доступе: мой номер почтового ящика (примечание: да, он правильный; с моим провайдером это ярлык при наборе номера с вашего собственного устройства, поэтому я могу свободно отображать его;) В конце первого скриншота вы видите:
CALL_STATE_IDLE
, Таким образом, нет телефонных звонков, входящих, исходящих или в процессе. Никакое приложение не нуждается в этом разрешении, чтобы «фонировать» себя на входящих звонках.
Можно даже увидеть, активны ли мобильные данные ( DATA_DISCONNECTED
когда я делал скриншоты, я был в WiFi, как вы можете видеть в панели уведомлений), в какой стране вы находитесь, ваш провайдер (включая некоторые технические данные о нем), у вас есть SIM-карта или вы находитесь в роуминге.
Единственное , что не доступен , следовательно , идентифицируют данные: IMEI, SIMID, IMSI и свой номер телефона.
Вывод: это разрешение необходимо только для целей идентификации, и ничего больше.
Зачем тогда так много приложений?
- Для рекламных модулей, скорее всего 1
- Потому что разработчик подумал, что ему это нужно (на что указывают некоторые ответы здесь) 2
- Поскольку рассматриваемое приложение предназначено для (также) запуска на Android 1.5 и ниже (это легко узнать, как это указано в Google Play ).
Вероятности именно в этом порядке, ИМХО.
1 примечание к сообщению Дэна в чате :
Политика Google Play теперь запрещает приложениям получать ваш IMEI, чтобы идентифицировать вас в рекламных целях. Все рекламные библиотеки были обновлены для использования «рекламного идентификатора», предоставляемого Google-Play-Services, поэтому обо всех, кто все еще использует IMEI для этой цели, следует сообщать в Google.
Поскольку пользователю трудно сказать, для чего приложение использует IMEI, вам следует сначала попросить разработчика объяснить.
2 Другой разработчик только что указал мне на небольшую разницу: хотя разрешение на чтение текущего состояния вызова не требуется (как я уже указывал), может потребоваться регистрация слушателя , чтобы получать уведомления об изменениях вызова. статус (см .: Обнаружение входящих и исходящих телефонных звонков на Android ). Хотя, кажется, есть способы обрабатывать это автоматически, когда системные вызовы onPause
, это может не всегда подходить: подумайте о своем будильнике. Возможно, вы не захотите, чтобы это автоматически прекращалось при входящем звонке, особенно если в вашем профиле отключена громкость звонка.
3 Снова исправление от Дэна : вы получаете дополнительное разрешение по умолчанию, только если «целевая» версия вашего приложения - 1.5. Если вы нацелены на более позднюю версию, но ваша минимальная версия - 1.5, разрешение не будет добавлено автоматически.
Обновления
- Интересно, что есть открытая проблема (21504), чтобы разделить
READ_PHONE_STATE
на то, что необходимо для: а) обнаружения входящих вызовов и связанных с ними (телефонии), а также второго разрешения для идентификационных данных (IMEI, IMSI и т. Д.). Открыт 11/2011, до сих пор не работал. Звезда это если интересно :)
- И да, есть способ достичь того же (обнаруживая входящие звонки) без с
READ_PHONE_STATE
разрешения, как , например , отметил Арно Welzel . Поскольку входящий телефонный звонок вызовет звонок, это событие может быть использовано с onAudioFocusChange()
, что не требует какого-либо специального разрешения: если это вызвано этим, приложение может проверить CallState (опять же, без какого-либо специального разрешения), чтобы увидеть, есть ли входящий звонок.