На телефонах Android SMS-сообщения, зарегистрированные в приложениях, также отправляются в почтовый ящик устройства. Однако для предотвращения беспорядка было бы неплохо иметь возможность удалять SMS-сообщения, специфичные для приложения, из почтового ящика, чтобы уменьшить потенциальное переполнение этих сообщений.
Вопросы в других группах Google о получении окончательного ответа о программном способе удаления SMS-сообщений из почтового ящика Android не кажутся актуальными.
Итак, сценарий:
- Запуск Android-приложения.
- зарегистрировать типы SMS-сообщений X, Y и Z
- сообщения P, Q, X, Y, Z передаются с течением времени, и все они хранятся во входящих
- Приложение Android обнаруживает получение X, Y, Z (предположительно как часть события прерывания программы)
- процесс X, Y, Z
- Желание !!! X, Y, Z удаляются из почтового ящика Android.
Это было сделано? Это можно сделать?
Ответы:
«Начиная с Android 1.6, входящие широковещательные сообщения SMS (
android.provider.Telephony.SMS_RECEIVED
) доставляются как« заказанные широковещательные сообщения »- это означает, что вы можете указать системе, какие компоненты должны получать широковещательные сообщения первыми».Это означает, что вы можете перехватить входящее сообщение и в дальнейшем прервать его трансляцию.
AndroidManifest.xml
Убедитесь, что в вашем файле установлен самый высокий приоритет:В вашем
BroadcastReceiver
, вonReceive()
методе , прежде чем выполнять что-либо с вашим сообщением, просто вызовитеabortBroadcast();
РЕДАКТИРОВАТЬ: Что касается KitKat, это, по-видимому, больше не работает.
EDIT2: Подробнее о том, как это сделать на KitKat, можно здесь:
Удалить SMS с android на 4.4.4 (Затронутые строки = 0 (ноль) после удаления)
источник
Используя предложения других, я думаю, что заставил его работать:
(с использованием SDK v1 R2)
Это не идеально, так как мне нужно удалить весь разговор, но для наших целей это достаточный компромисс, поскольку мы, по крайней мере, будем знать, что все сообщения будут просматриваться и проверяться. Нашему потоку, вероятно, потребуется затем прослушать сообщение, захватить сообщение, которое мы хотим, выполнить запрос, чтобы получить thread_id недавно связанного сообщения, и выполнить вызов delete ().
В нашей деятельности:
Примечание: мне не удалось удалить контент: // sms / inbox / или content: // sms / all /
Похоже, цепочка имеет приоритет, что имеет смысл, но сообщение об ошибке только воодушевило меня, чтобы разозлиться. При попытке удалить в sms / inbox / или sms / all / вы, вероятно, получите:
Для дополнительной справки обязательно поместите это в свой манифест для получателя намерений:
Обратите внимание, что тег получателя не выглядит так:
Когда у меня были эти настройки, android дал мне несколько сумасшедших исключений разрешений, которые не позволяли android.phone передавать полученное SMS в мои намерения. Итак, НЕ помещайте этот атрибут разрешения RECEIVE_SMS в свои намерения! Надеюсь, кто-нибудь более мудрый, чем я, скажет мне, почему это было так.
источник
Итак, у меня была игра, и это можно удалить получил SMS. К сожалению, не все гладко :(
У меня есть приемник, который принимает входящие SMS-сообщения. Теперь способ работы маршрутизации входящих SMS в Android заключается в том, что фрагмент кода, отвечающий за декодирование сообщений, отправляет широковещательную рассылку (он использует
sendBroadcast()
метод, который, к сожалению, НЕ является версией, которая позволяет вам просто звонитьabortBroadcast()
) всякий раз, когда приходит сообщение.Мой приемник может или не может быть вызван перед приемником Системных SMS, и в любом случае полученная широковещательная рассылка не имеет свойства, которое могло бы отражать
_id
столбец в таблице SMS.Однако, не будучи так легко остановленным, я отправляю себе (через обработчик) отложенное сообщение с SmsMessage в качестве прикрепленного объекта. (Полагаю, вы тоже могли бы опубликовать Runnable ...)
Задержка необходима для того, чтобы к моменту прибытия сообщения все получатели широковещательной рассылки завершили свою работу, и сообщение будет безопасно помещено в таблицу SMS.
Когда получено сообщение (или Runnable), я делаю вот что:
Я использую исходный адрес и поле временной метки, чтобы обеспечить очень высокую вероятность удаления ТОЛЬКО интересующего меня сообщения. Если бы я хотел быть еще более параноиком, я мог бы включить
msg.getMessageBody()
контент как часть запроса.Да, сообщение удалено (ура!). К сожалению панель уведомлений не обновляется :(
Когда вы откроете область уведомлений, вы увидите сообщение, которое находится там для вас ... но когда вы нажмете на него, чтобы открыть его, оно исчезло!
Для меня этого недостаточно - я хочу, чтобы все следы сообщения исчезли - я не хочу, чтобы пользователь думал, что есть TXT, когда его нет (это приведет только к сообщениям об ошибках).
Внутри ОС телефонные звонки
MessagingNotification.updateNewMessageIndicator(Context)
, но я этот класс был скрыт от API, и я не хотел реплицировать весь этот код только для того, чтобы сделать индикатор точным.источник
используйте это разрешение в AndroidManifyt
источник
Для удаления сообщения лучше использовать _id и thread_id.
Thread_id - это то, что присваивается сообщениям, приходящим от одного и того же пользователя. Итак, если вы используете только thread_id, все сообщения от отправителя будут удалены.
Если вы используете комбинацию _id, thread_id, тогда будет удалено именно то сообщение, которое вы хотите удалить.
источник
Вам нужно будет найти URI сообщения. Но как только вы это сделаете, я думаю, вы сможете его android.content.ContentResolver.delete (...).
Вот еще информация .
источник
Я думаю, что пока это невозможно сделать идеально. Есть 2 основные проблемы:
Как можно убедиться, что смс уже находится во входящих, когда вы пытаетесь его удалить?
Обратите внимание, что SMS_RECEIVED не является заказанной рассылкой.
Итак, решение dmyung - это попытка удачи; даже задержка с ответом Дуга не является гарантией.
SmsProvider не поточно. (См http://code.google.com/p/android/issues/detail?id=2916#c0 )
Тот факт , что более чем один клиенты запрашивающей удаления и вставки в него на в то же время вызовет повреждение данных или даже немедленное исключение времени выполнения.
источник
Я не мог заставить его работать с помощью решения dmyung, оно дало мне исключение при получении идентификатора сообщения или идентификатора потока.
В конце концов, я использовал следующий метод, чтобы получить идентификатор потока:
Тогда я смогу его удалить. Однако, как сказал Дуг, уведомление все еще есть, даже если сообщение отображается при открытии панели уведомлений. Только при нажатии на сообщение я действительно увидел, что оно пустое.
Поэтому я думаю, что единственный способ, которым это сработает, - это как-то перехватить SMS до того, как оно будет доставлено в систему, прежде чем оно даже попадет в почтовый ящик. Однако я очень сомневаюсь, что это выполнимо. Пожалуйста, поправьте меня, если я ошибаюсь.
источник
Используйте эту функцию, чтобы удалить конкретную цепочку сообщений или изменить в соответствии с вашими потребностями:
Вызовите эту функцию просто ниже:
Не забудьте добавить ниже разрешение android mainfest:
источник
Просто отключите уведомления для смс-приложения по умолчанию. Обработайте свои собственные уведомления для всех текстовых сообщений!
источник
Просто взгляните на эту ссылку, она даст вам краткое представление о логике:
https://gist.github.com/5178e798d9a00cac4ddb
Просто вызовите функцию deleteSMS () с некоторой задержкой, потому что есть небольшая разница между временем уведомления и когда оно на самом деле сохранено ...., подробнее см. также по этой ссылке ..........
http://htmlcoderhelper.com/how-to-delete-sms-from- inbox-in-android-программно /
Спасибо ..........
источник
Просто попробуйте следующий код, он удалит все смс, которые есть в телефоне (полученные или отправленные)
источник
Также обновите файл манифеста, чтобы удалить смс, вам нужны разрешения на запись.
источник
Теперь
abortBroadcast();
можно использовать метод, чтобы ограничить входящее сообщение во входящие.источник
Пример удаления одного SMS, а не разговора:
источник
источник
Попробуйте это, я на 100% уверен, что это сработает: - // просто поместите здесь адрес преобразования, чтобы удалить все преобразование по адресу (не забудьте добавить разрешение на чтение и запись в mainfest) Вот код:
источник
Используйте один из этих методов, чтобы выбрать последнее полученное SMS-сообщение и удалить его, в этом случае я получаю наибольшее количество смс и собираюсь удалить, используя поток и значение идентификатора смс,
источник