Итак, у меня была игра, и это можно удалить получил SMS. К сожалению, не все гладко :(
У меня есть приемник, который принимает входящие SMS-сообщения. Теперь способ работы маршрутизации входящих SMS в Android заключается в том, что фрагмент кода, отвечающий за декодирование сообщений, отправляет широковещательную рассылку (он использует 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, и я не хотел реплицировать весь этот код только для того, чтобы сделать индикатор точным.