言いたいこと

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 を許可していて、なぜ必要なのか?ということに言及した記事がなかなか見つからなかったのでここに書きました。

元記事はこちら

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