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();
}