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