所以,我进行了一些尝试,删除已接收到的短信是有可能的。但不幸的是,并非一帆风顺。
我有一个接收器可以监听到传入的短信。现在,Android 短信接收的路由方式是由负责解码消息的代码发送广播(使用 sendBroadcast()
方法 - 不幸的是,这不是让您简单调用 abortBroadcast()
的版本),每当接收到一条消息时。
我的接收器可能会在系统短信接收器之前或之后被调用,而且无论如何,接收到的广播都没有任何属性能够反映 SMS 表中的 _id
列。
然而,我并不容易放弃,我通过 Handler 发送了一个带有 SmsMessage 作为附加对象的延迟消息。(我想你也可以通过 Runnable 来实现...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500)
这个延迟是为了确保当消息到达时,所有的广播接收器都已经完成了它们的任务,而消息将会安全地存储在SMS表中。
当消息(或Runnable)在这里接收时,我所做的是:
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()
内容包含在查询中。
是的,消息已被删除(万岁!)。不幸的是,通知栏没有更新 :(
当你打开通知区域时,你会看到消息在那里等着你......但是当你点击它打开它时,它就消失了!
对我来说,这还不够好——我希望所有与该消息有关的痕迹都消失——我不希望用户认为有TXT而实际上没有(这只会导致错误报告)。
在操作系统内部,手机调用MessagingNotification.updateNewMessageIndicator(Context)
,但是该类已被隐藏在API中,我不想仅仅为了使指示器准确而复制所有代码。