Итак, у меня была игра, и можно удалить удаленное полученное SMS.
К сожалению, не все так просто: (
У меня есть приемник, который принимает входящие SMS-сообщения. Теперь способ входящей маршрутизации Android SMS состоит в том, что часть кода, ответственная за декодирование сообщений, отправляет широковещательную рассылку (она использует метод sendBroadcast()
- который, к сожалению, НЕ является версией, которая позволяет просто вызывать abortBroadcast()
) всякий раз, когда сообщение прибывает.
Мой приемник может вызываться или не вызываться до получения системного SMS-сообщения, и в любом случае полученная широковещательная рассылка не имеет свойства, которое могло бы отражать столбец _id
в таблице SMS.
Однако, будучи не тем, кого можно остановить, я легко отправляю (через обработчик) отложенное сообщение с сообщением SmsMessage в качестве прикрепленного объекта. (Полагаю, вы тоже можете разместить себе Runnable ...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
Задержка существует для того, чтобы к тому времени, когда сообщение прибыло, все получатели Broadcast завершили свои работы и сообщение было безопасно помещено в таблицу 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, и я не хотел копировать весь этот код только ради точности индикатора.