SubscriptionManager для чтения IMSI для устройств с двумя SIM-картами, работающими на Android 5.1+

Для API 22+ я пытаюсь использовать SubscriptionManager для чтения IMSI с двумя SIM-картами.

IMSI - это 14–15 символов в следующем формате: "MCC-MNC-MSIN" MCC = мобильный код страны (например, 310 для США); MNC = код мобильной сети (например, 410 для AT&T), MSIN = последовательный серийный номер.

В классе нет метода для получения IMSI. Есть методы, чтобы получить и MCC & MNC, но не MSIN.

Итак, мой вопрос, как получить полный IMSI с помощью SubscriptionManager?

Обновление: SubscriptionManager возвращает неверные / одинаковые MCC и MNC для разных SIM-карт. Тестирование на Motorola Moto E под управлением Android 5.1

Обновление: SubscriptionManager отлично работает на Moto G под управлением Android 6.0. Но нет возможности прочитать состояние SIM-карты.

1 ответ

Существует открытый, но скрытый способ получения идентификатора подписчика (IMSI для телефона GSM) для данного идентификатора подписки. Я не знаю, почему он скрыт, но вы можете назвать его без проблем, используя 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();
}
Другие вопросы по тегам