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