Smart Phone跟Featrue Phone不一样,短信不会放在ICC卡上,毕竟卡的存储空间是有限的。最近一网友很纠结,老在问我如何把短信写到UIM卡上?有没有办法写个通用的程序?这个主要决定于手机厂家没有实现相应的接口函数。
Android 提供把短信写入ICC卡的接口为:
frameworks/base/telephony/java/android/telephony/SmsManager.java copyMessageToIcc
如果是CDMA的话,调用过程如下:
frameworks/base/telephony/java/com/android/internal/telephony/cdma/RuimSmsInterfaceManager.java 里的函数 copyMessageToIccEf 调用
frameworks/base/telephony/java/com/android/internal/telephony/RIL.java 里的 writeSmsToRuim ,这个要发出
一个 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM 请求号,RILD接收请求,传给 libril,再给 reference-ril,这样,只要在 reference-ril 里的
onRequest (int request, void *data, size_t datalen, RIL_Token t) 处理这个 RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM 请求号即可,根据不同的模组,填入相应的AT处理函数。
像XT800,i909双网手机,在长按单条短信时,都弹出复制SMS至UIM卡选项。通过反编译Mms.apk包,可以看出他们都自己实现自己的接口,而没有实现Android默认的Api。xt800提供了一个content://sms/icc provider,大致是这样实现的:
String sSc = null;
Uri uSim = null;
ContentValues values = new ContentValues();
values.put("type", Integer.valueOf(mBody.mBoxId));
values.put("address", mBody.mAddress);
values.put("body", mBody);
values.put("data", Long.valueOf(mBody.mDateTime));
values.put("service_center", sSc);
if (MessageUtils.getDefaultMode().equals("CDMA")) {
Log.("ComposeMessageActivity", "start copy msg to UIM");
sSc = mContentResolver.insert(Uri.parse("content://sms/icc", values));
} else if (MessageUtils.getSecondaryMode().equals("CDMA")) {
sSc = mContentResolver.insert(Uri.parse("content://sms/icc2", values));
}
Log.("ComposeMessageActivity", "finish copy msg to UIM");
i909的,自己实现
private void copyMessageToUIM(MessageItem msgItem), 调用SmsManager.MakeSubmitPDU, 也是自己的实现的。
7 replies on “Android SMS 写入UIM卡”
学习了,多谢指点。我想试试xt800的Mms.apk的反编译,从rom中拿到了Mms.apk, Mms.odex, 还有相关的core.odex、 framework.odex等等,但在由odex转dex的过程中遇到了问题。能否再点拨一下,多谢了!
我参照网上查到的资料,从xt800 16.35.0的rom中获得的上述文件,然后下载了baksmali和smali(1.2.6),但在使用命令
java -jar baksmali-1.2.6.jar -x Mms.odex
时提示了很多类处理错误,被跳过的错误,比如
Error occured while disassembling class Lcom.android.mms.dom.smil.TimeImpl; – sk
ipping class
out目录是生成了。
然后试着执行
java -Xmx512M -jar smali-1.2.6.jar out -o classes.dex
也会报错(很多,例示如下)
out\com\android\mms\data\Contact$ContactsCache.smali[0,-1] no viable alternative
at input ”
然后就进行不下去了,楼主帮忙看看哪里有问题。
hi, 我用的是 16.12.4 版本,baksmali 是1.2.2,会报一些错误,你可以试试不同的 baksmail版本,也会有一些差异的。
多谢楼主答复!我再找相关版本试试。今天我写的demo有些进展,可以读出uim卡中的短信了,但写入短信是报错。现在已经加入了相关的uses-permission(read_sms、write_sms、receive_sms和send_sms都已经加入),logcat中没有提示权限问题了。报错信息如下,万望楼主有空是帮忙解答(google了两天没有结果)。
DatabaseUtils Writing exception to parcel
DatabaseUtils java.lang.NullPointerException
DatabaseUtils at com.android.providers.telephony.SmsProvider.insert(SmsProvider.java:494)…..
捕获异常打印栈信息如下
java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java 1224)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
ContentResolver mContentResolver = context.getContentResolver(); 这个很简单的,你检查你的参数看看,应该是某个是NULL 导致。
多谢楼主!已经解决了,最终还是设置您文章中的五个字段就可以了,开始的时候没有全部设置,只设置了前三个,以为系统会设置默认的。
受益匪浅,以后会经常关注您的博客。再次表示感谢!