Android 在SIM卡上访问短信

Android 在SIM卡上访问短信,android,sms,sim-card,Android,Sms,Sim Card,我需要访问储存在SIM卡(而不是手机)上的短信 根据grepcode(),android telephony.smsmsmanger API包含一个公共函数“getAllMessagesFromIcc()”,并指出该函数是从2.1版本开始存在的,但官方android SDK不支持此类函数 为什么会有差异 这个函数正是我所需要的。如果不存在,我如何读取SIM卡上当前的短信 我确实在stackoverflow()上找到了这篇文章,这似乎是我想要的,但实际上它扩展了“广播接收器”,我将其解释为捕获传入

我需要访问储存在SIM卡(而不是手机)上的短信

根据grepcode(),android telephony.smsmsmanger API包含一个公共函数“getAllMessagesFromIcc()”,并指出该函数是从2.1版本开始存在的,但官方android SDK不支持此类函数

为什么会有差异

这个函数正是我所需要的。如果不存在,我如何读取SIM卡上当前的短信

我确实在stackoverflow()上找到了这篇文章,这似乎是我想要的,但实际上它扩展了“广播接收器”,我将其解释为捕获传入的消息,而不是读取SIM卡上已经存储的消息

谢谢你的帮助。

找到了答案。 安卓系统中有许多公共功能都标有“(@HIDE)”标记。这些功能是从android SDK中剥离出来的,目的是阻止普通程序员使用这些功能

当然,对一些程序员来说,所带来的挑战实在太大了

有关详细信息,请参阅:


不幸的是,目前的手机(三星Galaxy S和LG,2012)似乎已经删除了他提到的文件,因此不再支持上述过程。

如果您可以访问串行设备(Android
/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"

这是我一直在与自己斗争的一件事。的确,许多函数都用@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;
}
public ArrayList getSimCardMessages(){
//此实现被记录为适用于android 1.6
//它在安卓2.3上测试正常
ArrayList=新建ArrayList();
试一试{
类smgrclass=Class.forName(“android.telephony.smsmsmanager”);
方法getSMGR=SMGRClass.getMethod(“getDefault”);
对象smsDefaultInstance=getSMGR.invoke(null);
方法getMessages=smsMgrClass.getMethod(“getAllMessagesFromIcc”);
@抑制警告(“未选中”)
list=(ArrayList)getMessages.invoke(smsDefaultInstance);
Log.d(“sms管理器”,“长度:+list.size());
}捕获(例外e){
e、 printStackTrace();
}
退货清单;
}

您可能需要查找示例代码中调用的所用android内置类和方法的详细信息。

如果用户没有sim卡,您该怎么办?在用户没有sim卡的情况下使用此应用程序是一种例外情况。应用程序将显示错误。好的,仅供参考,有大量用户没有SIM卡,但您可能知道这一点