对于 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/