Android - 携帯電話の電話番号を取得する方法

Androidから電話番号を取得する方法を紹介します。

1. TelephonyManager.getLine1Number() API

TelephonyManager.getLine1Number() は Phone 番号を返します。

次のようにコトリンで実装できます。

override fun onCreate(savedInstanceState: Bundle?) {
    ...

    val number = getPhoneNumber()
    Log.d("Test", "number: $number")
}

@SuppressLint("MissingPermission")
fun getPhoneNumber(): String {
    var tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    return tm.line1Number
}

上記のコードを実行してみると、次のように電話番号を出力します。

10-26 23:21:31.171 22398 22398 D Test    : number: 01012349876

2. Permission 設定

getLine1Number() API を使用するには、Phone 権限が必要です。 Android 11で必要な権限が変更されたため、これを考慮して権限を要求する必要があります。

Target SDK APIが30(Android 11)以上の場合は、マニフェストで READ_PHONE_NUMBERS権限を要求する必要があります。 もちろん、Runtime Permissionなので、ユーザーに要求して権限を取得する必要があります。

<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />

Target SDK APIが30未満(Android 10以下)の場合は、マニフェストで「READ_PHONE_STATE」権限を要求する必要があります。この権限もRuntime Permissionです。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

通常、アプリはAndroid 10と11の両方で動作するため、上記の両方のパーミッションを定義する必要があります。 Android 10以下でのみREAD_PHONE_NUMBERSパーミッションをリクエストするには、以下のようにmaxSdkVersion = "29"にMax SDKバージョンを設定してください。

<manifest>
    <!-- Grants the READ_PHONE_STATE permission only on devices that run
         Android 10 (API level 29) and lower. -->
    <uses-permission android:name="READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="READ_PHONE_NUMBERS" />
</manifest>

Android 11の変更の1つで、電話番号をインポートするときに必要な権限が READ_PHONE_STATEから READ_PHONE_NUMBERSに変更されました。

2.1 SMS権限

代表的には READ_PHONE_NUMBERS パーミッションが使用されますが、API ドキュメントを見ると READ_SMS パーミッションがあっても getLine1Number() を使って Phone 番号を取得できます。


/**
 * Returns the phone number string for line 1, for example, the MSISDN
 * for a GSM phone for a particular subscription. Return null if it is unavailable.
 * <p>
 * The default SMS app can also use this.
 *
 * <p>Requires Permission:
 *     {@link android.Manifest.permission#READ_SMS READ_SMS},
 *     {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS},
 *     that the caller is the default SMS app,
 *     or that the caller has carrier privileges (see {@link #hasCarrierPrivileges})
 *     for any API level.
 *     {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
 *     for apps targeting SDK API level 29 and below.
 */
@RequiresPermission(anyOf = {
        android.Manifest.permission.READ_PHONE_STATE,
        android.Manifest.permission.READ_SMS,
        android.Manifest.permission.READ_PHONE_NUMBERS
})
public String getLine1Number() {
    return getLine1Number(getSubId());
}

2.2 READ_PRIVILEGED_PHONE_STATE Permission

android.permission.READ_PRIVILEGED_PHONE_STATEは、Platformと同じ署名のアプリまたはPrivilegedアプリに付与される権限です。システムアプリにのみ許可される権限なので、APIドキュメントには紹介されていません。このパーミッションを持っていても getLine1Number() で Phone 番号を取得できます。

このパーミッションは Runtime permission ではなく Install permission なので、ユーザーに権限を要求する必要はありません。しかし、前述のように、一般的な3rd partyアプリはこの権限を受け取ることができません。

References

codechachaCopyright ©2019 codechacha