Android SMS 写入UIM卡

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, 也是自己的实现的。

If you enjoyed this post, make sure you subscribe to my RSS feed!

7 thoughts on “Android SMS 写入UIM卡

  1. 李洪波

    学习了,多谢指点。我想试试xt800的Mms.apk的反编译,从rom中拿到了Mms.apk, Mms.odex, 还有相关的core.odex、 framework.odex等等,但在由odex转dex的过程中遇到了问题。能否再点拨一下,多谢了!

    Reply
  2. 李洪波

    我参照网上查到的资料,从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 ”

    然后就进行不下去了,楼主帮忙看看哪里有问题。

    Reply
    1. deli Post author

      hi, 我用的是 16.12.4 版本,baksmali 是1.2.2,会报一些错误,你可以试试不同的 baksmail版本,也会有一些差异的。

      Reply
  3. 李洪波

    多谢楼主答复!我再找相关版本试试。今天我写的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)

    Reply
    1. deli Post author

      ContentResolver mContentResolver = context.getContentResolver(); 这个很简单的,你检查你的参数看看,应该是某个是NULL 导致。

      Reply
  4. 李洪波

    多谢楼主!已经解决了,最终还是设置您文章中的五个字段就可以了,开始的时候没有全部设置,只设置了前三个,以为系统会设置默认的。

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *