SubscriptionManager用于读取双SIM卡设备的IMSI,从而破坏Android 5.1 +

时间:2016-04-27 23:55:46

标签: android dual-sim

对于API 22+,我尝试使用SubscriptionManager来读取双SIMI。

IMSI是14到15个字符,格式如下:" MCC-MNC-MSIN" MCC =移动国家/地区代码(例如,美国为310); MNC =移动网络代码(例如,对于AT& T为410),MSIN =顺序序列号。

类中没有方法来获取IMSI。有方法可以获得MCC和& MNC但不是MSIN。

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

更新 SubscriptionManager返回错误/相同的MCC&适用于不同SIM卡的MNC。在运行Android 5.1的Motorola Moto E上进行测试

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

1 个答案:

答案 0 :(得分: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();
}