所以,我玩了一个游戏,可以删除收到的短信。
不幸的是,这并非一帆风顺:(
我有一个接收器接收传入的 SMS 消息。现在,Android SMS 传入路由的工作方式是负责解码消息的代码段发送一个广播(它使用 sendBroadcast() 方法 - 不幸的是,它不是让您简单地调用 abortBroadcast() 的版本)每当有消息时到了。
我的接收器可能会或可能不会在系统 SMS 接收器之前被调用,并且在任何情况下接收到的广播都没有可以反映 SMS 表中的 _id 列的属性。
但是,我不是那么容易被阻止的人,我(通过处理程序)向自己发布了一条延迟消息,其中 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 隐藏了该类,我不想仅仅为了使指标准确而复制所有代码。