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

Android - Modify SMS Body before arriving the Inbox

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

到目前为止,我已经设法确定了一个有前途的 class:InboundSmsHandler。在内部 class SmsBroadcastReceiver 中,当 SMS 到达时触发 onReceive 方法,稍后发送 "SMS_RECEIVED" 意图。所以基本上这个方法似乎是在一个好地方。

问题是我无法修改以onReceive 为目的发送的SMS。 我已经尝试用PDU修改了:

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

(此方法无效,短信App已显示原消息)

试图直接修改 SmsMessage 的正文: (我在 SmsMessage 中添加了一个方法,可以修改正文)

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

(此方法无效,短信App已显示原消息)

最后向数据库添加了一条新短信:

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

....

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

有谁知道如何在 SMS 到达收件箱之前对其进行修改?

此致 薄荷

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);

感谢所有的回答,我在 InboundSmsHandler 中找到了一个可以在发送广播之前修改 PDU 的地方:方法 proccessMessagePart。命令前 "intent.putExtra("pdus", pdus);"执行后,可以修改 pdus 数组和消息正文。