Posted at

【Android】TelephonyManager#get 系で情報を取得するには READ_PHONE_STATE が必要な理由


言いたいこと

Telephonymanager#get 系のメソッド(例えば getSimOperatorName)で情報を取得するには、READ_PHONE_STATE パーミッションが必要です。


経緯

業務で TelephonyManager#getSimOperatorName メソッドから通信キャリアの情報を取得する必要がありコードを書いたところ、プルリクエストで

「これ READ_PHONE_STATE パーミッションって必要?ドキュメントに required って書いてないけど?」

と言われました。

https://developer.android.com/reference/android/telephony/TelephonyManager.html#getSimOperatorName()


getSimOperatorName

Added in API level 1

public String getSimOperatorName ()

Returns the Service Provider Name (SPN).

Availability: SIM state must be SIM_STATE_READY

Returns

String

See also:

getSimState()


確かにドキュメントには書いてないです。

が、実際にこのパーミッションを許可したりしなかったりして調べてみた結果、

メソッドのアクセスには READ_PHONE_STATE は必要ないが、これを許可せずにアクセスしても空文字しか返ってこない

ということが分かりました。

    
パーミッションあり(許可)
パーミッションなし(許可なし)

SIMあり
キャリア情報が取得される
空文字が取得される

SIMなし
空文字が取得される
空文字が取得される

TelephonyManager でググるといろいろ記事は出ますが、みんな当然のように READ_PHONE_STATE を許可していて、なぜ必要なのか? ということに言及した記事がなかなか見つからなかったのでここに書きました。