Как удалить SMS из ящика входящих сообщений в Android программно?

@app.route('/', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True) # force=True will make sure this works even if a client does not specify application/json
    language = req_data['language'] # or whatever key you have in your json

    return '''The language value is: {}'''.format(language)
98
задан Peter Mortensen 24 January 2011 в 11:46
поделиться

6 ответов

Необходимо будет найти URI сообщения. Но как только Вы делаете я думаю, что необходимо быть в состоянии к android.content. ContentResolver.delete (...) это.

Вот еще немного приблизительно информация .

5
ответ дан Neil 24 November 2019 в 05:16
поделиться

Используя предложения от других, я думаю, что заставил его работать:

(использование SDK v1 R2)

Это не прекрасно, так как я должен удалить весь разговор, но в наших целях, это - достаточный компромисс, поскольку мы будем, по крайней мере, знать, что на все сообщения посмотрят и проверят. Наш поток должен будет, вероятно, тогда прислушаться к сообщению, получение для сообщения, которое мы хотим, сделайте запрос, чтобы получить thread_id недавно входящего сообщения и сделать удаление () вызов.

В нашем Действии:

Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uriSms, null,null,null,null); 
int id = c.getInt(0);
int thread_id = c.getInt(1); //get the thread_id
getContentResolver().delete(Uri.parse("content://sms/conversations/" + thread_id),null,null);

Примечание: Я не смог сделать удаление на content://sms/inbox/или content://, SMS/все /

Похоже на поток, имеет приоритет, который имеет смысл, но сообщение об ошибке только ободрило меня, чтобы быть более сердитым. При попытке удаления на sms/inbox/или SMS/всем/, Вы, вероятно, доберетесь:

java.lang.IllegalArgumentException: Unknown URL
    at com.android.providers.telephony.SmsProvider.delete(SmsProvider.java:510)
    at android.content.ContentProvider$Transport.delete(ContentProvider.java:149)
    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:149)

Для дополнительной ссылки также, удостоверьтесь, что поместили это в свою декларацию для Вашего поглощенного получателя:

<receiver android:name=".intent.MySmsReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
    </intent-filter>
</receiver>

Примечание тег получателя не похож на это:

<receiver android:name=".intent.MySmsReceiver" 
    android:permission="android.permission.RECEIVE_SMS">

, Когда у меня были те настройки, андроид дал мне некоторые сумасшедшие исключения полномочий, которые не позволили android.phone вручать от полученного SMS моему намерению. Так, НЕ помещайте это атрибут разрешения RECEIVE_SMS в Ваше намерение! Надо надеяться, кто-то более мудрый, чем я может сказать мне, почему это имело место.

27
ответ дан Mike Mackintosh 24 November 2019 в 05:16
поделиться

Итак, у меня была игра, и можно удалить полученное SMS. К сожалению, не все гладко: (

У меня есть приемник, который принимает входящие SMS-сообщения. Теперь маршрутизация входящих SMS-сообщений Android работает так: фрагмент кода, отвечающий за декодирование сообщений, отправляет широковещательную рассылку (он использует sendBroadcast () - который, к сожалению, НЕ является версией, которая позволяет вам просто вызывать abortBroadcast () ) всякий раз, когда приходит сообщение.

Мой получатель может быть вызван или не может быть вызван до Системный получатель SMS, и в любом случае полученная широковещательная рассылка не имеет свойства, которое могло бы отражать столбец _id в таблице SMS.

Однако, не будучи тем, кого так легко остановить, я отправляю себя (через Handler) отложенное сообщение с 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 () как часть запроса.

Да, сообщение удалено (ура!).

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 () содержание как часть запроса.

Да, сообщение удалено (ура!).

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, и я не хотел реплицировать весь этот код только для того, чтобы сделать индикатор точным.

24
ответ дан 24 November 2019 в 05:16
поделиться

Я думаю, что пока это невозможно сделать идеально. Есть две основные проблемы:

  1. Как убедиться, что смс уже находится в папке «Входящие», когда вы пытаетесь удалить его?
    Обратите внимание, что SMS_RECEIVED не является заказанной рассылкой.
    Итак, решение dmyung - это попытка удачи; даже задержка в ответе Дуга не является гарантией.

  2. SmsProvider не является потокобезопасным. (см. http://code.google.com/p/android/issues/detail?id=2916#c0 )
    Тот факт, что более одного клиента запрашивают удаление и вставку одновременно, вызовет повреждение данных или даже немедленное исключение времени выполнения.

2
ответ дан 24 November 2019 в 05:16
поделиться

Я не мог заставить его работать с помощью решения dmyung, оно вызывало исключение при получении идентификатора сообщения или идентификатор потока.

В конце концов, я использовал следующий метод, чтобы получить идентификатор потока:

private long getThreadId(Context context) {
    long threadId = 0;

    String SMS_READ_COLUMN = "read";
    String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
    String SORT_ORDER = "date DESC";
    int count = 0;

    Cursor cursor = context.getContentResolver().query(
                    SMS_INBOX_CONTENT_URI,
          new String[] { "_id", "thread_id", "address", "person", "date", "body" },
                    WHERE_CONDITION,
                    null,
                    SORT_ORDER);

    if (cursor != null) {
            try {
                count = cursor.getCount();
                if (count > 0) {
                    cursor.moveToFirst();
                    threadId = cursor.getLong(1);                              
                }
            } finally {
                    cursor.close();
            }
    }


    return threadId;
}

Затем я мог его удалить. Однако, как сказал Дуг, уведомление все еще есть, даже если сообщение отображается при открытии панели уведомлений. Только при нажатии на сообщение я действительно увидел, что оно пустое.

Так что, я думаю, единственный способ, которым это сработает, - это как-то перехватить SMS перед этим » доставляется в систему еще до того, как попадет в почтовый ящик. Однако я очень сомневаюсь, что это выполнимо. Пожалуйста, поправьте меня, если я ошибаюсь.

2
ответ дан 24 November 2019 в 05:16
поделиться

Просто отключите уведомления для приложения смс по умолчанию. Обрабатывайте собственные уведомления для всех текстовых сообщений!

1
ответ дан 24 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: