我需要访问存储在SIM卡上的短信(不在手机上)。
根据grepcode(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/telephony/SmsManager.java),android telephony.SmsManger API包含一个公共函数“getAllMessagesFromIcc()”,并指出这存在于2.1,但官方的android SDK不支持这样的功能。
为何出现差异?
这个功能可以完全满足我的需要。如果它不存在,我该如何阅读当前SIM卡上的短信?
我确实在stackoverflow(Retrieving the SMS Messages from the SIM card on with android)上找到了这篇文章,它看起来像我想做的那样,但它实际上扩展了“广播接收器”,我将其解释为捕获传入的消息,而不是读取已经存储的消息SIM卡。
感谢您的帮助。
答案 0 :(得分:2)
找到答案。 Android中有许多标记有“(@HIDE)”标记的公共函数。这些函数从android SDK中删除,以阻止(好吧,几乎阻止)普通程序员使用它们。
当然,引入的挑战对于某些程序员来说太过分了......
有关详细信息,请参阅: http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/
不幸的是,似乎当前的手机(三星Galaxy S和LG,2012)已经删除了他所引用的文件,因此不再支持上述过程。
答案 1 :(得分:2)
这是我一直在与自己作斗争的一件事。确实很多函数都用@HIDE注释标记。
经过一段时间的研究,我注意到我可以利用隐藏方法使用Reflection读取SIM消息。你可以在Java中查找Reflection。
请注意,在使用隐藏/内部方法时,无法保证这些方法在现有的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内置类和方法的详细信息。
答案 2 :(得分:0)
如果您可以访问串行设备(Android seems to have /dev/smd0
可用),那么您可以使用以下AT命令从SIM读取短信:
AT+CPMS="SM","SM"
AT+CMGF=0
AT+CMGL=4
以上是PDU模式,使用以下文本模式
AT+CPMS="SM","SM"
AT+CMGF=1
AT+CMGL="ALL"