所以,我有一出戏,它是可以删除收到的短信。不幸的是,这并非一帆风顺。
我有一个接收器,可以接收传入的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(只会导致错误报告)。
在OS内部,电话MessagingNotification.updateNewMessageIndicator(Context)
,但是我已经将该类从API中隐藏了,我不想为了确保指示器的准确性而复制所有代码。