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.


person Beshoy Fayez    schedule 27.04.2016    source источник
comment
Не будет ли MISN подпискойInfo.getNumber()?   -  person Gabe Sechan    schedule 28.04.2016
comment
В документации это четко не указано, и она всегда пуста. Кроме того, мне здесь не нужен MSISDN. @GabeSechan   -  person Beshoy Fayez    schedule 28.04.2016
comment
Обязательно ли вам использовать SubscriptionManager? Если вы используете класс SystemProperties для получения номера, в чем будет проблема?   -  person Lampard    schedule 28.04.2016
comment
@CrazyAndroid Меня не волнует номер телефона. Я хочу полный IMSI. SubscriptionManager предоставляет первую часть (MCC и MNC), но не последнюю часть (MSIN), которая представляет собой уникальный 9-значный номер, не равный номеру телефона.   -  person Beshoy Fayez    schedule 28.04.2016


Ответы (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();
}
person Angelos Veglektsis    schedule 28.06.2016
comment
Почему этот метод скрыт? - person Filipe Esperandio; 28.07.2016
comment
Я еще не нашел ответа, но атрибут скрытия является лишь частью javadoc (также и droiddoc), поэтому скрытие просто означает, что метод/класс/поле исключен из документов API. - person Angelos Veglektsis; 01.08.2016
comment
Я понимаю концепцию. Я не понимаю причин скрывать некоторые методы от API, особенно те, которые частично открыты, как в том случае, когда getSubscriberId() отображается, а getSubscriberId(int subscriptionId) нет. - person Filipe Esperandio; 02.08.2016