Доступ к SMS-сообщениям на SIM-карте

Мне нужно получить доступ к SMS-сообщениям, хранящимся на SIM-карте (не на телефоне).

Согласно grepcode ( http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/telephony/SmsManager.java ), API android telephony.SmsManger API Включает публичную функцию «getAllMessagesFromIcc ()» и указывает, что это существовало из 2.1, однако официальный SDK для Android не поддерживает такую ​​функцию.

Почему расхождение?

Эта функция будет делать то, что мне нужно. Если этого не существует, как я могу прочитать SMS-сообщение, которое сейчас находится на SIM-карте?

Я нашел это сообщение в stackoverflow ( получение SMS-сообщений с SIM-карты с помощью android ), которые SEEMS выполняют то, что я хочу, но на самом деле он расширяет «широковещательный приемник», который я интерпретирую как ловушку входящих сообщений, а не чтение сообщений Уже сохраненный на SIM-карте.

Спасибо за любую помощь.

Нашел ответ. В Android есть ряд публичных функций, отмеченных тегом «(@HIDE)». Эти функции удаляются из SDK android, чтобы препятствовать (в значительной степени предотвратить) их использование средним программистом.

Конечно, задача, введенная для некоторых программистов, слишком велика …

Для получения дополнительной информации см .: http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

К сожалению, похоже, что текущие телефоны (Samsung Galaxy S и LG, 2012) удалили файл, на который он ссылается, поэтому вышеупомянутый процесс больше не поддерживается.

Это была одна вещь, с которой я боролся с собой. Это правда, что многие функции были отмечены аннотацией @HIDE.

После некоторого периода исследований я заметил, что могу воспользоваться скрытым методом чтения сообщений SIM с помощью Reflection. Вы можете посмотреть Reflection на Java.

Обратите внимание, что при использовании скрытых / внутренних методов вам не гарантируется, что эти методы будут существовать или иметь одинаковое поведение на существующих платформах (версиях) Android.

Импортируйте следующие пакеты

import android.telephony.SmsMessage; import java.lang.reflect.Method; 

Ниже приведен пример кода, чтобы попробовать, он работал для меня в любом случае.

 public ArrayList<SmsMessage> getSimCardMessages() { // this implementation was recorded to work for android 1.6 // it was tested Ok on android 2.3 ArrayList<SmsMessage> list = new ArrayList<SmsMessage>(); try { Class<?> smsMgrClass = Class.forName("android.telephony.SmsManager"); Method getSMSMgr = smsMgrClass.getMethod("getDefault"); Object smsDefaultInstance = getSMSMgr.invoke(null); Method getMessages = smsMgrClass.getMethod("getAllMessagesFromIcc"); @SuppressWarnings("unchecked") list = (ArrayList<SmsMessage>) getMessages.invoke(smsDefaultInstance); Log.d("sms manager", "length: " + list.size()); } catch (Exception e) { e.printStackTrace(); } return list; } 

Возможно, вам захочется найти http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/telephony/SmsManager.java#SmsManager.getAllMessagesFromIcc%28 % 29 для получения подробной информации о используемом встроенном классе и методе android, вызванном в примере кода.

Если вы можете получить доступ к серийному устройству (у Android, похоже, имеется /dev/smd0 ), вы можете читать SMS-сообщения с SIM-карты со следующими AT-командами:

 AT+CPMS="SM","SM" AT+CMGF=0 AT+CMGL=4 

Вышеупомянутый режим PDU, используйте следующий для текстового режима

 AT+CPMS="SM","SM" AT+CMGF=1 AT+CMGL="ALL"