目前,我正在尝试在将传入短信保存到收件箱之前对其进行修改。由于系统是Android 4.4.4,因此无法使用高优先级广播接收器进行简单的拦截。这也是我修改Android源代码(AOSP)而不是构建应用程序的原因。
到目前为止,我已经设法确定了一个有前途的类:InboundSmsHandler。在内部类 SmsBroadcastReceiver 中,当 SMS 到达时会触发 onReceive 方法,稍后会发送"SMS_RECEIVED"意图。所以基本上这种方法似乎处于一个好位置。
问题是我无法修改以onReceive的意图发送的SMS。我已经尝试使用 PDU 修改它:
byte[] pdu = createFakePDU("15555215556", "modified body");
intent.putExtra("pdus", new Object[] { pdu });
intent.putExtra("format", "3gpp");
(这种方法不起作用,短信应用程序已显示原始消息)
已尝试直接修改短信的正文:(我在短信中添加了一个方法,以便能够修改正文)
SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);
int pduCount = msgs.length;
for(int i=0; i<pduCount; i++)
{
msgs[i].modifyBody("test");
}
(这种方法不起作用,短信应用程序已显示原始消息)
最后在数据库中添加了一条新的短信:
....
contentResolver.insert( Uri.parse( SMS_URI ), values );
....
(这种方法的问题在于原始SMS仍然到达,因此不仅有一个修改的SMS,而且一个原始SMS和一个修改后的SMS到达。原始短信必须删除,但我不知道如何删除。
有谁知道如何在短信到达收件箱之前对其进行修改?
此致敬意薄荷
AFAIK,在 4.4.4 上,没有什么可以通过注册您的 BroadcastReceiver、设置正确的权限和正确的意图过滤器来阻止您的应用程序接收短信。那是:
<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(),根据需要修改短信,最后手动存储
getContentResolver().insert(Uri.parse("content://sms/sent"), values);
感谢您的所有答案,我在InboundSmsHandler中找到了一个可以在发送广播之前修改PDU的位置:方法proccessMessagePart。在执行命令"intent.putExtra("pdus", pdus);"之前,可以修改pdus数组和消息正文。