2016-04-27 184 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)'不是。 –