После большого количества исследований на форумах теперь я знаю, что нет способа найти серийный номер IMSI или SIM-карты для обеих SIM-карт в телефоне с двумя SIM-картами (за исключением обращения к производителю). Теперь мой измененный вопрос: можем ли мы вообще определить, что в телефоне две SIM-карты? Я считаю, что это можно обнаружить с помощью некоторого интеллекта. Я могу придумать несколько способов:
Набор USSD-кода и отслеживание журналов для номера IMEI (я пробовал это с * 139 # в Индии. Это сработало.) Это даст мне номер IMEI для SIM-карты, с которой я набрал код USSD. (Предполагается, что телефон соответствует требованиям Android и имеет два номера IMEI.)
Сохранение серийного номера SIM-карты и / или IMSI для SIM-карты. И после обнаружения любого другого IMSI / серийного номера, даже если телефон не был перезагружен (т.е. была переключена SIM-карта), путем отслеживания некоторых журналов или обработки некоторых широковещательных событий.
Набрав * 06 #, вы увидите оба номера IMEI. Каким-то образом получить эти два числа. (Что-то вроде захвата экрана и анализа изображения для текста.)
Если кто-то может придумать другие способы, мы будем рады их приветствовать. Я был бы очень признателен за любую помощь в этом отношении. Кроме того, если у кого-то есть какая-либо информация о каких-либо API производителей или ссылки для связи с ними, пожалуйста, поделитесь с людьми из сообщества.
Ответы:
Обновление 23 марта 2015 г .:
Другой возможный вариант:
Вы можете использовать отражение Java, чтобы получить оба номера IMEI.
Используя эти номера IMEI, вы можете проверить, является ли телефон ДВОЙНОЙ SIM-картой или нет.
Попробуйте следующее действие:
А вот и
TelephonyInfo.java
:Редактировать :
Получение доступа к методам, подобным "getDeviceIdGemini", к деталям другого слота SIM-карты предполагает, что метод существует.
Если имя этого метода не совпадает с именем, указанным производителем устройства, он не будет работать. Вы должны найти соответствующее имя метода для этих устройств.
Найти имена методов для других производителей можно с помощью отражения Java следующим образом:
РЕДАКТИРОВАТЬ :
Как отметила Сита в своем комментарии:
Это работает для нее. Ей удалось получить два номера IMEI для обеих SIM-карт в устройстве Samsung Duos.
Добавить
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
РЕДАКТИРОВАТЬ 2:
Метод, используемый для получения данных, предназначен для Lenovo A319 и других телефонов этого производителя (Кредит Махер Абутраа ):
источник
com.android.internal.telephony.RILConstants$SimCardID
внутренне. Даже пытался создать этот класс с той же сигнатурой методов и одинаковыми именами переменных. Но не повезло. Постараюсь получить исходный код и попробую проверить. Спасибо.У меня есть устройство Samsung Duos с Android 4.4.4, и метод, предложенный Ситой в принятом ответе (т.е. вызов getDeviceIdDs), не работает для меня, так как этот метод не существует. Мне удалось восстановить всю необходимую информацию, вызвав метод getDefault (int slotID), как показано ниже:
Кроме того, я переписал код, который итеративно проверяет методы для восстановления этой информации, чтобы он использовал массив имен методов вместо последовательности try / catch. Например, чтобы определить, есть ли у нас две активные SIM-карты, мы можем:
Таким образом, если для какого-либо устройства предлагается новое имя метода, вы можете просто добавить его в массив, и он должен работать.
источник
Я нашел несколько нативных решений, когда искал способ проверить оператора сети.
Для API> = 17:
В AndroidManifest добавьте разрешение:
Чтобы получить оператора сети, вы можете проверить коды mcc и mnc:
Для API> = 22:
Для API> = 23. Чтобы просто проверить, является ли телефон двойной / тройной / много SIM-картой:
источник
Я могу читать оба IMEI телефона OnePlus 2
источник
Я смотрел журналы вызовов и заметил, что помимо обычных полей в содержимом managedCursor, у нас есть столбец simid в телефонах с двумя SIM-картами (я проверял на Xolo A500s Lite), чтобы отмечать каждый звонок в журнале звонков с симкой. Это значение либо 1, либо 2, скорее всего, обозначает SIM1 / SIM2.
Ни в одном телефоне с одной симкой не нашел эту колонку (проверял на Xperia L).
Поэтому, хотя я не думаю, что это надежный способ проверки наличия двух SIM-карт, я публикую его здесь, потому что он может быть кому-то полезен.
источник
Подсказки:
Вы можете попробовать использовать
ctx.getSystemService("phone_msim")
вместо того
ctx.getSystemService(Context.TELEPHONY_SERVICE)
Если вы уже пробовали ответ Vaibhav и
telephony.getClass().getMethod()
не смогли , то это работает для моего мобильного телефона Qualcomm .источник
Я нашел эти системные свойства на Samsung S8
Также согласно источнику: https://android.googlesource.com/platform/frameworks/base/+/master/telephony/java/com/android/internal/telephony/TelephonyProperties.java
getprop persist.radio.multisim.config
возвращает "dsds
" или "dsda
" на мульти-сим-карте.Я тестировал это на Samsung S8, и он работает
источник
Commonsware говорит, что это невозможно. См. Следующее:
Обнаружение Dual SIM с помощью Android SDK невозможно.
Вот дальнейший диалог по этому поводу:
Парень из команды разработчиков Google говорит, что обнаружить Dual SIM с помощью Android SDK невозможно.
источник