So, I had a play, and it is possible to delete a received SMS.
Unfortunately it s not all plain sailing :(
我有一个接收器可以接收到来信短信。现在 Android 短信接收路由的工作方式是,负责解码消息的代码片段在每次消息到达时发送一个广播(它使用 sendBroadcast()
方法 - 不幸的是这不是让您简单调用abortBroadcast()
的版本)。
我的接收器可能会在系统SMS接收器之前或之后被调用,而且无论哪种情况,接收到的广播都没有任何属性可以反映SMS表中的_id
列。
然而,作为一个不易停止的人,我通过处理程序将SmsMessage作为附加对象发送了一条延迟消息(我想你也可以发送一个Runnable…)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
延迟存在是为了确保当消息到达时,所有广播接收器都已完成其工作,并且消息将安全地嵌入短信列表中。
当接收到消息(或可运行对象)时,我会做这些:
case MSG_DELETE_SMS:
Uri deleteUri = Uri.parse("content://sms");
SmsMessage msg = (SmsMessage)message.obj;
getContentResolver().delete(deleteUri, "address=? and date=?", new String[] {msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis())});
我使用发件地址和时间戳字段来确保只删除我感兴趣的消息的概率非常高。如果我想变得更加多疑,我可以将msg.getMessageBody()
内容作为查询的一部分包含在内。
Yes, the message IS deleted (hooray!).
Unfortunately the notification bar is not updated :(
当您打开通知区域时,您会看到消息等待您查看... 但是当您点击打开它时,它就消失了!
对我来说,这还不够好 - 我希望信息的所有痕迹都消失 - 我不想让用户认为有TXT,当事实上没有(这只会导致错误报告)。
在操作系统内部,手机调用了MessagingNotification.updateNewMessageIndicator(Context)
,但是那个类已经从API中隐藏了,为了使指示器准确,我不想复制所有的代码。