我该如何获取手机的ICCID号码?
我查看了TelephonyManager类,但没找到获取ICCID号码的方法,只有一种方法可以告诉是否存在IC卡。
我该如何获取手机的ICCID号码?
我查看了TelephonyManager类,但没找到获取ICCID号码的方法,只有一种方法可以告诉是否存在IC卡。
我相信getSimSerialNumber()
将获取iccid。
更新适用于Android 5.1 (感谢Erick M Sprengel)
在Android 5.1 (API 22)中添加了“多SIM卡支持”。
您可以使用SubscriptionManager
而不是使用getSimSerialNumber
。
SubscriptionManager sm = SubscriptionManager.from(mContext);
// it returns a list with a SubscriptionInfo instance for each simcard
// there is other methods to retrieve SubscriptionInfos (see [2])
List<SubscriptionInfo> sis = sm.getActiveSubscriptionInfoList();
// getting first SubscriptionInfo
SubscriptionInfo si = sis.get(0);
// getting iccId
String iccId = si.getIccId();
你需要获得权限:(鸣谢Damian)
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
最好不要使用这个,因为这是最近被限制的标识符之一,就像最近在Android 10上所做的那样。
在Android 11(API 30)上,即使您没有针对它进行目标设置,您也很可能只会得到一个空字符串。
推荐使用getSubscriptionId代替(需要READ_PHONE_STATE权限)。
原因:
返回 ICC ID。从 API 级别 30 开始,如果调用应用程序已被授予 READ_PRIVILEGED_PHONE_STATE 权限、具有运营商特权 (参见 TelephonyManager#hasCarrierPrivileges) 或是设备所有者或配置文件所有者并已获得 READ_PHONE_STATE 权限,则返回 ICC ID。配置文件所有者是拥有设备上托管配置文件的应用程序;更多详细信息请参见工作配置文件。配置文件所有者访问已过时,并将在未来版本中删除。因此,如果不满足这些要求之一,则返回空字符串。对于第三方应用程序,这意味着您可能总是会收到空字符串。如果您不符合这些要求(您通常不符合),则可以使用它。final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
final List<SubscriptionInfo> activeSubscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
然后对于每个订阅,您可以使用subscriptionInfo.getIccId()
。
非常感谢@Jakar!以下是使用Xamarin / Mono.Android编写的C#代码:
需要在AndroidManifest.xml中设置权限集。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
简单的C#
using System.Collections.Generic;
using Android.Telephony;
// ...
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Requires, android.permission.READ_PHONE_STATE
SubscriptionManager sm = Android.Telephony.SubscriptionManager.From(Android.App.Application.Context);
IList<SubscriptionInfo> sis = sm.ActiveSubscriptionInfoList;
SubscriptionInfo si = sis[0];
string carrier = si.CarrierName;
string iccId = si.IccId;
string phoneNum = si.Number;
System.Diagnostics.Debug.WriteLine("Carrier: " + carrier);
System.Diagnostics.Debug.WriteLine("SIM Card IccId: " + iccId);
System.Diagnostics.Debug.WriteLine("Phone Number: " + phoneNum);
// Bonus, Get the IMEI Id (aka, DeviceId)
TelephonyManager tm = (TelephonyManager)GetSystemService(Android.Content.Context.TelephonyService);
string deviceId = tm.DeviceId;
System.Diagnostics.Debug.WriteLine("Device Id: " + deviceId);
}
SubscriptionManager 和 SubscriptionInfo 都位于 Android.Telephony 命名空间下。
说实话,这个例子是为了在没有SIM卡工具的情况下即时激活我的手机而需要的。而且,我的眼睛不如以前那么好了。请在 gist.github.com 上查看DroidTelephonySimInfo.cs