在SIM上访问SMS消息

时间:2012-04-26 18:44:24

标签: android sms sim-card

我需要访问存储在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卡。

感谢您的帮助。

3 个答案:

答案 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"