目前我正在尝试修改收到的短信,然后将其保存到收件箱。 由于系统是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 );
....
(该方法的问题是原始短信仍然到达,因此不仅一条修改后的短信,而且一条原始短信和一条修改后的短信到达。原始短信必须删除,但我不知道如何。)
有人知道如何在收到收件箱之前修改短信吗?
祝你好运 薄荷
答案 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数组,从而修改消息体。