Android 在SIM卡上访问短信
我需要访问储存在SIM卡(而不是手机)上的短信 根据grepcode(),android telephony.smsmsmanger API包含一个公共函数“getAllMessagesFromIcc()”,并指出该函数是从2.1版本开始存在的,但官方android SDK不支持此类函数 为什么会有差异 这个函数正是我所需要的。如果不存在,我如何读取SIM卡上当前的短信 我确实在stackoverflow()上找到了这篇文章,这似乎是我想要的,但实际上它扩展了“广播接收器”,我将其解释为捕获传入的消息,而不是读取SIM卡上已经存储的消息 谢谢你的帮助。找到了答案。 安卓系统中有许多公共功能都标有“(@HIDE)”标记。这些功能是从android SDK中剥离出来的,目的是阻止普通程序员使用这些功能 当然,对一些程序员来说,所带来的挑战实在太大了 有关详细信息,请参阅:Android 在SIM卡上访问短信,android,sms,sim-card,Android,Sms,Sim Card,我需要访问储存在SIM卡(而不是手机)上的短信 根据grepcode(),android telephony.smsmsmanger API包含一个公共函数“getAllMessagesFromIcc()”,并指出该函数是从2.1版本开始存在的,但官方android SDK不支持此类函数 为什么会有差异 这个函数正是我所需要的。如果不存在,我如何读取SIM卡上当前的短信 我确实在stackoverflow()上找到了这篇文章,这似乎是我想要的,但实际上它扩展了“广播接收器”,我将其解释为捕获传入
不幸的是,目前的手机(三星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卡,但您可能知道这一点