如何获取手机的ICCID号码?

13

我该如何获取手机的ICCID号码?

我查看了TelephonyManager类,但没找到获取ICCID号码的方法,只有一种方法可以告诉是否存在IC卡。


澄清一点:手机 没有 ICCID。SIM卡 ICCID,并且手机可以在任何时候插入零个、一个或多个SIM卡(取决于手机型号)。 - jaimet
3个回答

21

我相信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" />

为了证明这一点,我的ATT SIM卡有20个数字。不同的运营商可能会有所不同。我已经多次测试了该函数,并且它总是能够满足我的需求,尽管我实际上没有检查它返回多少个字符。 - Reed
4
我理解SIM卡序列号和ICCID是同一物。 - Lavekush Agrawal
1
@Reed...我已经使用不同的SIM供应商检查了上述代码,当设备中的SIM更改时,ID也会更改。 - Ravindra Kushwaha
好的,我知道 ICCID 的长度是 12 位。但正确的 ICCID 长度应该是 20 位吧? - Bingchean
@Bingchean,https://www.imei.info/faq-what-is-ICCID/ 上说,“账户ID”是12位数字。也许它返回的是不带国家和字符信息的账户ID?我不确定。我想知道手机硬件设置是否会显示不同的内容?或者实体卡上打印的ICCID只有12位数字?也许这取决于运营商? - Reed
显示剩余5条评论

7

最好不要使用这个,因为这是最近被限制的标识符之一,就像最近在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()


ICCID号码是否取决于SIM类型,例如Airtel、Idea、Vodaphone等公司供应商?请帮我解答。 - Ravindra Kushwaha
@RavindraKushwaha 我不知道,但正如我所写的,建议不要使用它。 - android developer
谢谢您的建议!!! 我有一个问题, 请帮助我解决: 如何唯一地标识任何设备? 是否有任何方法或技巧可以做到这一点?再次感谢。 - Ravindra Kushwaha
是的,这对于每个应用程序来说都是不同的,我之前测试过了。如果将来您有任何解决方案,请告诉我。再次感谢 :) - Ravindra Kushwaha
是的,你说得很好。这条路不会很容易。 - Ravindra Kushwaha
显示剩余5条评论

2

非常感谢@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);
}

SubscriptionManagerSubscriptionInfo 都位于 Android.Telephony 命名空间下。

说实话,这个例子是为了在没有SIM卡工具的情况下即时激活我的手机而需要的。而且,我的眼睛不如以前那么好了。请在 gist.github.com 上查看DroidTelephonySimInfo.cs


@VladMatvienko,由于此方法使用SubscriptionManager,我相信答案是肯定的。不过,你可以随意尝试一下。 https://developer.android.com/about/versions/android-5.1.html - Damian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接