Android - 在到达收件箱之前修改SMS正文

时间:2015-01-07 15:13:11

标签: android sms inbox

目前我正在尝试修改收到的短信,然后将其保存到收件箱。 由于系统是Android 4.4.4,因此无法使用高优先级广播接收器进行简单拦截。这也是我修改Android Source(AOSP)而不是构建App的原因。

到目前为止,我已经设法识别出一个有前途的类:InboundSmsHandler。在内部类SmsBroadcastReceiver中,当SMS到达时触发onReceive方法,稍后发送“SMS_RECEIVED”意图。所以基本上这种方法似乎处于一个好位置。

问题是我无法修改随onReceive提供的短信。 我已尝试使用PDU修改它:

byte[] pdu = createFakePDU("15555215556", "modified body");
intent.putExtra("pdus", new Object[] { pdu });
intent.putExtra("format", "3gpp");

(此方法不起作用,SMS App显示原始消息)

试图直接修改SmsMessage的主体: (我已经为SmsMessage添加了一个能够修改主体的方法)

SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);
int pduCount = msgs.length;
for(int i=0; i<pduCount; i++)
{
    msgs[i].modifyBody("test");
}

(此方法不起作用,SMS App显示原始消息)

最后在数据库中添加了一条新的短信:

....
contentResolver.insert( Uri.parse( SMS_URI ), values );

....

(该方法的问题是原始短信仍然到达,因此不仅一条修改后的短信,而且一条原始短信和一条修改后的短信到达。原始短信必须删除,但我不知道如何。)

有人知道如何在收到收件箱之前修改短信吗?

祝你好运 薄荷

2 个答案:

答案 0 :(得分:1)

AFAIK,在4.4.4上,没有什么可以通过注册您的BroadcastReceiver,设置正确的权限和正确的意图过滤器来阻止您的应用程序接收SMS。那就是:

<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

(如果我正确记住它们)

然后在您的BroadcastReceiver中调用abortBroadcast(),根据需要修改SMS,最后用

手动存储它
getContentResolver().insert(Uri.parse("content://sms/sent"), values);

答案 1 :(得分:1)

感谢所有的答案,我在InboundSmsHandler中找到了一个位置,可以在发送广播之前修改PDU:方法proccessMessagePart。在命令之前&#34; intent.putExtra(&#34; pdus&#34;,pdus);&#34;执行时,可以修改pdus数组,从而修改消息体。