Esta pregunta me ha estado molestando bastante tiempo. Así que ahora, finalmente, decidí llegar al fondo del problema.
Playstore tiene una aplicación llamada permission.READ_PHONE_STATE , que solicita READ_PHONE_STATE
como el único permiso, y no hace nada más que imprimir todos los datos a los que puede acceder con o sin usarlo. Lo instalé en mi LG Optimus 4X , rooteado de Android 4.0.3, y revoqué el permiso usando LBE. Los resultados fueron bastante interesantes, como muestran las siguientes capturas de pantalla:
Información recopilada por el permiso de la aplicación. READ_PHONE_STATE (haga clic en las imágenes para ver las variantes más grandes)
Como puede ver fácilmente, incluso alguna información que el desarrollador, aunque inaccesible sin el permiso, era de acceso libre: mi número de buzón (comentario: Sí, es el correcto; con mi proveedor ese es el acceso directo cuando marca desde su propio dispositivo, para que pueda mostrarlo libremente;) Al final de la primera captura de pantalla, verá:
CALL_STATE_IDLE
. Por lo tanto, no hay llamadas entrantes, salientes o en curso. Ninguna aplicación necesita este permiso para "en segundo plano" en las llamadas entrantes.
Incluso es posible ver si los datos móviles están activos ( DATA_DISCONNECTED
; estaba en WiFi cuando tomé las capturas de pantalla, como puede ver en la barra de notificaciones), en qué país se encuentra, su proveedor (incluidos algunos datos técnicos sobre él), si tienes una tarjeta SIM o si estás en roaming.
Por lo tanto, lo único que no es accesible son los datos de identificación: IMEI, SIMID, IMSI y su propio número de teléfono.
Conclusión: Este permiso solo es necesario para fines de identificación, nada más.
¿Por qué tantas aplicaciones lo necesitan entonces?
- Para los módulos de anuncios, lo más probable es que 1
- Porque el desarrollador pensó que lo necesitaba (como señalan algunas respuestas aquí) 2
- Debido a que la aplicación en cuestión está diseñada para (también) ejecutarse en Android 1.5 y versiones posteriores (es fácil de encontrar, ya que aparece en Google Play ).
Probabilidades exactamente en este orden, en mi humilde opinión.
1 Nota de la publicación de Dan en el chat :
La política de Google Play ahora prohíbe que las aplicaciones obtengan su IMEI para identificarlo con fines publicitarios. Todas las bibliotecas de anuncios se han actualizado ahora para usar el "ID de publicidad" proporcionado por Google-Play-Services, por lo que cualquier que todavía use el IMEI para este propósito debe informarse a Google.
Como es difícil para el usuario saber para qué está usando la aplicación el IMEI, primero debe pedirle al desarrollador que le explique.
2 Otro desarrollador me señaló una sutil diferencia: aunque no es necesario el permiso para leer el estado actual de la llamada (como he señalado), podría ser necesario registrar un oyente para recibir notificaciones sobre los cambios de la llamada estado (consulte: Detección de llamadas entrantes y salientes en Android ). Si bien parece haber medios para manejar esto automáticamente cuando el sistema llama onPause
, eso no siempre es adecuado: piense en su reloj despertador. Es posible que no desee que eso se detenga automáticamente en una llamada entrante, especialmente cuando su perfil está configurado en volumen de timbre "silenciado".
3 Una vez más, una corrección de Dan : solo obtienes el permiso adicional predeterminado si la versión "objetivo" de tu aplicación es 1.5. Si apunta a una versión posterior pero su versión mínima es 1.5, no obtendrá el permiso agregado automáticamente.
Actualizaciones
- Es interesante que haya un problema abierto (21504) para dividir
READ_PHONE_STATE
en lo que se necesita para a) detectar llamadas entrantes y relacionadas (telefonía), y un segundo permiso para los detalles de identificación (IMEI, IMSI, etc.). Abierto 11/2011, todavía no ha trabajado. Marcar con estrella si está interesado :)
- Y sí, hay una manera de lograr lo mismo (detectar llamadas entrantes) sin el
READ_PHONE_STATE
permiso, como, por ejemplo, señaló Arno Welzel . Como una llamada telefónica entrante activaría el timbre, ese evento podría usarse onAudioFocusChange()
, lo que no requiere ningún permiso especial: si se activa por eso, la aplicación podría verificar el CallState (nuevamente, sin ningún permiso especial requerido) para ver si hay un llamada entrante.