.NET for AndroidでSIMカードの電話番号を取得する

Android 6以降 編集

Android 6.0 (API Level 23)以降で電話番号を取得するには以下の権限が必要です。

  • android.permission.READ_PHONE_STATE

Android 13以降 編集

Android 13 (API Level 33)以降で電話番号を取得するにはREAD_PHONE_STATEに加えて以下の権限が必要になりました。

  • android.permission.READ_PHONE_NUMBERS
  • android.permission.READ_PRIVILEGED_PHONE_STATE

また、従来の方法では空文字が返ってくるようになりましたので確実にソースコード内で処理を分岐する必要があります。

大雑把なコード 編集

var subscriptionManager = SubscriptionManager.From(Android.App.Application.Context);

// SIMスロット数でループ
for (int simSlotIndex = 0; simSlotIndex < simSlotCount; simSlotIndex++)
{
    // SIMカードの情報を取得
    var subscriptionInfo = subscriptionManager.GetActiveSubscriptionInfoForSimSlotIndex(simSlotIndex);
    if (subscriptionInfo != null);
    {
        var phoneNumber = "";

        if (Android.OS.BuildVersionCodes.Tiramisu <= Android.OS.Build.VERSION.SdkInt)
        {
            phoneNumber = subscriptionManager.GetPhoneNumber(subscriptionInfo.SubscriptionId);
        }
        else if (Android.OS.BuildVersionCodes.M <= Android.OS.Build.VERSION.SdkInt)
        {// API Level 23 (Android 6.0) 以上
            phoneNumber = subscriptionInfo.Number;
        }
        else 
        {// もう存在しないだろ
            throw new NotSupportedException();
        }

        Console.WriteLine($"sim {simSlotIndex} = {phoneNumber}");
    }
}