This question has been bothering me quite some time. So now, finally, I decided to get to the bottom of the issue.
The Playstore has an app named permission.READ_PHONE_STATE, which requests READ_PHONE_STATE
as the only permission, and does nothing else than printing out all data it can access with or without using it. I've installed that on my LG Optimus 4X, being rooted on stock Android 4.0.3, and revoked the permission using LBE. Results where pretty interesting, as the following screenshots show:

Information gathered by the app permission.READ_PHONE_STATE (click images for larger variants)
As you can easily see, even some information the dev though inaccessible without the permission, was freely accessible: my mailbox number (remark: Yes, it's the correct one; with my provider that's the shortcut when dialing from your own device, so I can freely display it ;) At the end of the first screenshot you see:
CALL_STATE_IDLE
. So no phone call incoming, outgoing, or in progress. No app needs this permission to "background" itself on incoming calls.
It's even possible to see whether mobile data are active (DATA_DISCONNECTED
; I was on WiFi when taking the screenshots, as you can see in the notification bar), which country you're in, your provider (including some technical data on him), whether you're having a SIM card, or if you're in roaming.
The only things not accessible hence are identifying data: IMEI, SIMID, IMSI, and your own phone number.
Conclusion: This permission is only needed for identification purposes, nothing else.
Why do so many apps need it then?
- For the ad modules, most likely1
- Because the dev thought he needs it (as pointed out by some answers here)2
- Because the app in question is designed to (also) run on Android 1.5 and below (easy to find out, as that's listed on Google Play).
Likelihoods in exactly this order, IMHO.
1 Note by Dan's post on chat:
Google Play policy now forbids apps from getting your IMEI to identify you for advertising purposes. All the ad libraries have been updated now to use the Google-Play-Services-provided "advertising ID", so any that still use the IMEI for this purpose should be reported to Google.
As it's hard for the user to tell what the app is using the IMEI for, you should ask the developer to explain first.
2 Another developer just pointed me to a subtle difference: while the permission is not needed to read the current call status (as I've pointed out), it might be needed to register a listener in order to be notified on changes of the call status (see: Detecting incoming and outgoing phone calls on Android). While there seem to be means of handling this automatically when the system calls onPause
, that might not always be suitable: think of your alarm clock. You might not want to have that automatically stopped on an incoming call – especially not when your profile is set to ringer volume "muted".
3 Again a correction from Dan: You only get the default extra permission if your app's "target" version is 1.5. If you target a later version but your min version is 1.5, you don't get the permission added automatically.
Updates
- Interesting that there's an open issue (21504) to divide
READ_PHONE_STATE
in what's needed to a) detect incoming calls and related (telephony), and a second permission for the identification details (IMEI, IMSI, etc). Opened 11/2011, still not worked on. Star it if interested :)
- And yes, there's a way to achieve the same (detecting incoming calls) without the
READ_PHONE_STATE
permission, as e.g. pointed out by Arno Welzel. As an incoming phone call would trigger the ringer, that event could be used with onAudioFocusChange()
, which does not require any special permission: if triggered by that, the app could check the CallState (again, without any special permission required) to see whether there's an incoming call.