Esta questão está me incomodando há algum tempo. Então agora, finalmente, decidi ir ao fundo da questão.
O Playstore tem um aplicativo chamado permission.READ_PHONE_STATE , que solicita READ_PHONE_STATE
como a única permissão e não faz nada além de imprimir todos os dados que pode acessar com ou sem usá-lo. Instalei isso no meu LG Optimus 4X , enraizado no Android 4.0.3, e revoguei a permissão usando o LBE. Resultados bastante interessantes, como mostram as seguintes capturas de tela:
Informações coletadas pela permissão do aplicativo.READ_PHONE_STATE (clique nas imagens para obter variantes maiores)
Como você pode ver facilmente, mesmo algumas informações do desenvolvedor, embora inacessíveis sem a permissão, eram acessíveis gratuitamente: o número da minha caixa de correio (observação: Sim, é o correto; com o meu provedor esse é o atalho ao discar do seu próprio dispositivo, para que eu possa exibi-lo livremente;) No final da primeira captura de tela, você vê:
CALL_STATE_IDLE
. Portanto, nenhuma ligação é recebida, efetuada ou em andamento. Nenhum aplicativo precisa dessa permissão para se "background" próprio nas chamadas recebidas.
É até possível ver se os dados móveis estão ativos ( DATA_DISCONNECTED
; eu estava no WiFi ao tirar as capturas de tela, como você pode ver na barra de notificação), em qual país você está, seu provedor (incluindo alguns dados técnicos sobre ele), se você está usando um cartão SIM ou em roaming.
As únicas coisas que não estão acessíveis são os dados de identificação: IMEI, SIMID, IMSI e seu próprio número de telefone.
Conclusão: Essa permissão é necessária apenas para fins de identificação, nada mais.
Por que tantos aplicativos precisam?
- Para os módulos de anúncios, provavelmente 1
- Porque o desenvolvedor pensou que ele precisava (como indicado por algumas respostas aqui) 2
- Como o aplicativo em questão foi projetado para (também) ser executado no Android 1.5 e abaixo (fácil de descobrir, conforme listado no Google Play ).
Probabilidades exatamente nessa ordem, IMHO.
1 Nota da postagem de Dan no chat :
A política do Google Play agora proíbe que os aplicativos obtenham seu IMEI para identificá-lo para fins de publicidade. Todas as bibliotecas de anúncios foram atualizadas agora para usar o "ID de publicidade" fornecido pelo Google-Play-Services. Portanto, qualquer um que ainda use o IMEI para essa finalidade deve ser relatado ao Google.
Como é difícil para o usuário saber para que o aplicativo está usando o IMEI, peça ao desenvolvedor que explique primeiro.
2 Outro desenvolvedor acabou de me apontar uma diferença sutil: embora a permissão não seja necessária para ler o status da chamada atual (como eu indiquei), pode ser necessário registrar um ouvinte para ser notificado sobre as alterações da chamada status (consulte: Detectando chamadas telefônicas recebidas e efetuadas no Android ). Embora pareça haver meios de lidar com isso automaticamente quando o sistema ligar onPause
, isso nem sempre é adequado: pense no seu despertador. Talvez você não queira que isso seja interrompido automaticamente em uma chamada recebida - especialmente quando o seu perfil estiver definido para o volume da campainha "mudo".
3 Mais uma vez, uma correção de Dan : você obtém a permissão extra padrão se a versão "alvo" do seu aplicativo for 1,5. Se você segmentar uma versão posterior, mas a sua versão mínima for 1,5, você não receberá a permissão automaticamente.
Atualizações
- Interessante que haja um problema em aberto (21504) a ser dividido
READ_PHONE_STATE
no que é necessário para: a) detectar chamadas recebidas e relacionadas (telefonia), e uma segunda permissão para os detalhes de identificação (IMEI, IMSI, etc.). Aberto em 11/2011, ainda não foi trabalhado. Marque se estiver interessado :)
- E sim, existe uma maneira de conseguir o mesmo (detectar chamadas recebidas) sem a
READ_PHONE_STATE
permissão, como por exemplo, apontado por Arno Welzel . Como uma ligação recebida acionaria a campainha, esse evento poderia ser usado onAudioFocusChange()
, o que não requer nenhuma permissão especial: se acionado por isso, o aplicativo poderia verificar o CallState (novamente, sem nenhuma permissão especial necessária) para ver se há um chamada recebida.