Questa domanda mi ha infastidito da un po 'di tempo. Quindi ora, finalmente, ho deciso di arrivare in fondo al problema.
Playstore ha un'app denominata permesso.READ_PHONE_STATE , che richiede READ_PHONE_STATE
come unica autorizzazione e non fa altro che stampare tutti i dati a cui può accedere con o senza utilizzarla. L'ho installato sul mio LG Optimus 4X , essendo rootato su Android 4.0.3 di serie e revocato l'autorizzazione usando LBE. I risultati sono stati piuttosto interessanti, come mostrano i seguenti screenshot:
Le informazioni raccolte dalle app permission.READ_PHONE_STATE (cliccare sulle immagini per le varianti più grandi)
Come puoi facilmente vedere, anche alcune informazioni lo sviluppatore, sebbene inaccessibili senza l'autorizzazione, erano liberamente accessibili: il mio numero di casella vocale (nota: Sì, è quello corretto; con il mio provider è la scorciatoia quando compongo dal tuo dispositivo, quindi posso visualizzalo liberamente;) Alla fine del primo screenshot vedi:
CALL_STATE_IDLE
. Quindi nessuna telefonata in arrivo, in uscita o in corso. Nessuna app ha bisogno di questa autorizzazione per "inserirsi" nelle chiamate in arrivo.
È anche possibile vedere se i dati mobili sono attivi ( DATA_DISCONNECTED
; ero su WiFi quando prendevo gli screenshot, come puoi vedere nella barra di notifica), in quale paese ti trovi, il tuo provider (inclusi alcuni dati tecnici su di lui), se hai una scheda SIM o se sei in roaming.
Le uniche cose non accessibili quindi sono l'identificazione dei dati: IMEI, SIMID, IMSI e il tuo numero di telefono.
Conclusione: questa autorizzazione è necessaria solo a scopo identificativo, nient'altro.
Perché così tante app ne hanno bisogno?
- Per i moduli pubblicitari, molto probabilmente 1
- Perché lo sviluppatore ha pensato di averne bisogno (come sottolineato da alcune risposte qui) 2
- Perché l'app in questione è progettata per (anche) funzionare su Android 1.5 e versioni precedenti (facile da scoprire, come elencato su Google Play ).
Probabilità esattamente in questo ordine, IMHO.
1 Nota del post di Dan sulla chat :
Le norme di Google Play ora vietano alle app di indurre l'IMEI a identificarti a fini pubblicitari. Tutte le librerie di annunci sono state aggiornate ora per utilizzare l '"ID pubblicità" fornito dai servizi Play di Google, quindi tutti quelli che utilizzano ancora l'IMEI per questo scopo devono essere segnalati a Google.
Poiché è difficile per l'utente dire a cosa sta utilizzando l'app IMEI, dovresti chiedere allo sviluppatore di spiegare prima.
2 Un altro sviluppatore mi ha appena indicato una sottile differenza: mentre l'autorizzazione non è necessaria per leggere lo stato della chiamata corrente (come ho sottolineato), potrebbe essere necessario registrare un ascoltatore per essere informato sulle modifiche della chiamata stato (vedi: Rilevamento di chiamate in entrata e in uscita su Android ). Mentre sembrano esserci mezzi per gestirlo automaticamente quando il sistema chiama onPause
, potrebbe non essere sempre adatto: pensa alla tua sveglia. Potresti non volerlo interrompere automaticamente durante una chiamata in arrivo, soprattutto quando il tuo profilo è impostato sul volume della suoneria "disattivato".
3 Ancora una correzione da Dan : otterrai l'autorizzazione extra predefinita solo se la versione "target" della tua app è 1.5. Se scegli come target una versione successiva ma la tua versione minima è 1.5, non ottieni l'autorizzazione aggiunta automaticamente.
aggiornamenti
- Interessante che ci sia un problema aperto (21504) da dividere
READ_PHONE_STATE
in ciò che è necessario per a) rilevare chiamate in arrivo e relative (telefonia) e una seconda autorizzazione per i dettagli di identificazione (IMEI, IMSI, ecc.). Aperto l'11 / 2011, non ha ancora funzionato. Stella se interessati :)
- E sì, c'è un modo per ottenere lo stesso (rilevare le chiamate in arrivo) senza l'
READ_PHONE_STATE
autorizzazione, come ad esempio sottolineato da Arno Welzel . Come una chiamata in arrivo innescherebbe la suoneria, che evento potrebbe essere utilizzato con onAudioFocusChange()
, che non richiede alcun permesso speciale: se attivato, con questo, l'applicazione potrebbe verificare il CallState (ancora una volta, senza alcun permesso speciale richiesto) per vedere se c'è un chiamata in arrivo.