3

对于 API 22+,我正在尝试使用 SubscriptionManager 来读取双 SIM 卡 IMSI。

IMSI 是一个 14 到 15 个字符,格式如下:“MCC-MNC-MSIN” MCC = 移动国家代码(例如美国的 310);MNC = 移动网络代码(例如 AT&T 的 410),MSIN = 序列号。

类中没有获取 IMSI 的方法。有一些方法可以同时获得 MCC 和 MNC,但不能获得 MSIN。

所以我的问题是,如何使用 SubscriptionManager 获得完整的 IMSI?

更新: SubscriptionManager 为不同的 SIM 卡返回错误/相同的 MCC 和 MNC。在运行 Android 5.1 的摩托罗拉 Moto E 上进行测试

更新: SubscriptionManager 在运行 Android 6.0 的 Moto G 上运行良好。但是没有办法读取 SIM 状态。

4

1 回答 1

5

有一种公开但隐藏的方法可以获取给定订阅 ID 的订阅者 ID(GSM 电话的 IMSI)。我不知道为什么它是隐藏的,但是您可以使用 java 反射毫无问题地调用它。

甚至 getSubscriberId 在内部调用 getSubscriberId(int subId),所以我认为它使用起来是安全的。

这是一个例子。

TelephonyManager telephonyManager = (TelephonyManager) mContext
            .getSystemService(Context.TELEPHONY_SERVICE);
int slotIndex = 1;
int subscriptionId = SubscriptionManager.from(mContext).getActiveSubscriptionInfoForSimSlotIndex(slotIndex).getSubscriptionId();
try {
    Class c = Class.forName("android.telephony.TelephonyManager");
    Method m = c.getMethod("getSubscriberId", new Class[] {int.class});
    Object o = m.invoke(telephonyManager, new Object[]{subscriptionId});

    String subscriberId = (String) o;
} catch (Exception e) {
    e.printStackTrace();
}
于 2016-06-28T09:04:24.057 回答