2016-04-27 6 views
2

API 22+では、SubscriptionManagerを使用してデュアルSIM IMSIを読み込もうとしています。サブスクリプションマネージャがデュアルSIMデバイスのIMSIを読んで、Android 5.1+を破棄しました

IMSIは、「MCC-MNC-MSIN」 の形式で14〜15文字です。MCC =モバイル国コード(米国の場合310など)。 MNC =モバイルネットワークコード(例えば、AT & Tの410)、MSIN =シーケンシャルシリアル番号。

IMSIを取得するメソッドはクラスにありません。 MCC & MNCを取得する方法はありますが、MSINは取得できません。

私の質問は、SubscriptionManagerを使用して完全なIMSIを取得する方法です。

更新: SubscriptionManagerが異なるのSIMに同じ/間違っMCC & MNCを返します。アンドロイド5.1

アップデートを実行しているモトローラモトEでのテスト: SubscriptionManagerは、Android 6.0を実行しているモトGで正常に動作しています。しかし、SIMの状態を読み取る方法はありません。

+0

MISNはsubscriptionInfo.getNumber()ですか。 –

+0

文書にはそのことが明確に示されておらず、常に空です。 ここに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)'は公開されていません。 –

関連する問題