3

API 22+ の場合、SubscriptionManager を使用してデュアル SIM IMSI を読み取ろうとしています。

IMSI は、次の形式の 14 ~ 15 文字です。MNC = モバイル ネットワーク コード (AT&T の場合は 410 など)、MSIN = 連続したシリアル番号。

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

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

更新: SubscriptionManager は、異なる SIM に対して間違った/同じ MCC と MNC を返します。Android 5.1 を実行している Motorola Moto E でのテスト

更新: SubscriptionManager は、Android 6.0 を実行している Moto G で正常に動作しています。ただし、SIM ステータスを読み取る方法はありません。

4

1 に答える 1

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();
}
于 2016-06-28T09:04:24.057 に答える