android - SubscriptionManager 为运行 Android 5.1+ 的双 SIM 卡设备读取 IMSI

标签 android dual-sim

对于 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 状态。

最佳答案

有一个公开但隐藏的方法可以获取给定订阅 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();
}

关于android - SubscriptionManager 为运行 Android 5.1+ 的双 SIM 卡设备读取 IMSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36902916/

相关文章:

java - fragment 内的菜单未被调用

java - Android:尝试根据所选的另一个微调器项目创建一个微调器

android - flutter : trigger a change of screen on a websocket message

android - 在 Marshmallow 及以下 android 中通过 sim 插槽获取通话记录

android - 展讯芯片组。双 Sim 应用程序从指定的 sim 插槽发送短信。 (< 22)

android - 在双卡 android 中禁用数据连接

android - 在 eclipse 中调试 Android 返回堆栈

java - 单例共享首选项问题

android - 从第二个 sim 调用

安卓 : How to get SIM ID of both SIM in Dual SIM mobile