4

我需要访问存储在 SIM 卡上的 SMS 消息(不在手机上)。

根据 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 卡上的 SMS 消息?

我确实在stackoverflow上找到了这篇文章(Retrieving the SMS Messages from the SIM card on with android),这似乎可以做我想做的事,但它实际上扩展了“广播接收器”,我将其解释为捕获传入的消息,而不是阅读消息已存储在 SIM 卡上。

谢谢你的帮助。

4

3 回答 3

2

Found the answer. There are a number of public functions in Android that are marked with an "(@HIDE)" tag. These functions are stripped from the android SDK to discourage (well, pretty much prevent) their use by the average programmer.

Of course, the challenge introduced is just too much for some programmers...

For more info, see: http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

Unfortunately, it seems like current phones (a Samsung Galaxy S, and a LG, 2012) have removed the file he refers to, so the above process is no longer supported.

于 2012-05-04T17:52:48.210 回答
2

这是我一直在与自己斗争的一件事。的确,很多函数都标有@HIDE 注解。

经过一段时间的研究,我注意到我可以利用反射的隐藏方法来读取 SIM 消息。您可以在 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 内置类和方法的详细信息。

于 2013-05-26T02:57:06.890 回答
0

如果您可以访问串行设备(Android似乎 /dev/smd0可用),那么您可以使用以下 AT 命令从 SIM 中读取 SMS 消息:

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

上面是PDU模式,下面是文本模式

AT+CPMS="SM","SM"
AT+CMGF=1
AT+CMGL="ALL"
于 2013-05-09T02:27:42.357 回答