2016-04-27 61 views
2

对于API 22+我试图使用SubscriptionManager读取双SIM卡IMSI。SubscriptionManager读取双SIM卡设备的IMSI ruuning Android 5.1+

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

在课堂上没有办法获得IMSI。有两种方法可以同时获得MCC & MNC而不是MSIN。

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

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

更新: SubscriptionManager在运行Android 6.0的Moto G上正常工作。但是没有办法读取SIM卡状态。

+0

不会MISN是subscriptionInfo.getNumber()? –

+0

该文档没有明确说明,并且始终为空。 Besids我不需要这里的MSISDN。 @GabeSechan –

+0

您是否有必要使用SubscriptionManager?如果使用SystemProperties类获取号码,将会出现什么问题? – Lampard

回答

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(); 
} 
+0

这个方法为什么隐藏? –

+0

我还没有找到答案,但“隐藏”属性只是javadoc(droiddoc也是)的一部分,所以“隐藏”只是表示方法/类/字段被排除在API文档之外。 –

+0

我理解这个概念。我不明白从API中隐藏某些方法的原因,但是,特别是一些部分暴露的方法,比如在那里'getSubscriberId()'被暴露但是'getSubscriberId(int subscriptionId)'不是。 –

相关问题