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

голоса
96

На Android телефонов SMS сообщения, зарегистрированные в приложениях также посылают в почтовый ящик устройства. Однако, чтобы избежать беспорядка, было бы неплохо, чтобы иметь возможность удалить приложение конкретного SMS сообщение из почтового ящика, чтобы уменьшить потенциальные переполнения этих сообщений.

Вопросы, кажется, на других группах Google на получение окончательного ответа на программный способ удаления SMS-сообщения из Android Входящие не следует нажать.

Так сценарий:

  • Android запуска App.
  • Регистр типов SMS-сообщений X, Y и Z
  • Сообщения P, Q, X, Y, Z поток в течение времени, все на хранение в почтовом ящике
  • Android-приложение обнаруживает получение X, Y, Z (предположительно как часть программы прерывания события)
  • Процесс X, Y, Z,
  • Desirement !!! X, Y, Z будут удалены из Android Входящие

Был ли он сделал? Можно ли это сделать?

Задан 07/01/2009 в 05:25
источник пользователем
На других языках...                            


18 ответов

голоса
87

«По состоянию на Android 1.6, вещает входящий SMS сообщения ( android.provider.Telephony.SMS_RECEIVED) передаются как„упорядоченное вещание“- это означает , что вы можете указать систему , какие компоненты должны получать трансляцию первой.»

Это означает, что вы можете перехватить входящее сообщение и прервать трансляцию его дальше.

В вашем AndroidManifest.xmlфайле, убедитесь , чтобы иметь приоритет набор к высшему:

<receiver android:name=".receiver.SMSReceiver" android:enabled="true">
    <intent-filter android:priority="1000">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

В ваших BroadcastReceiver, в onReceive()методе, прежде чем выполнять что - либо с сообщением, просто вызовитеabortBroadcast();

EDIT: На KitKat, это больше не работает, по-видимому.

EDIT2: Более подробная информация о том, как это сделать на KitKat здесь:

Удаление SMS из андроида на 4.4.4 (изменяемых строк = 0 (ноль), после того, как удален)

Ответил 02/06/2011 d 07:29
источник пользователем

голоса
27

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

(С помощью SDK v1 R2)

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

В нашей деятельности:

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);

Примечание: Я не был в состоянии сделать удаление на содержание: // смс / Входящие / или содержание: // смс / все /

Похоже, нить имеет преимущество, которое имеет смысл, но сообщение об ошибке только придал смелости, чтобы я злее. При попытке Удалить на 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 передать от Получаемого сообщения с моим намерением. Таким образом, не положить, что RECEIVE_SMS атрибут разрешения в своих намерениях! Надеюсь кто-то мудрее, чем мне может сказать мне, почему это так.

Ответил 13/01/2009 d 16:53
источник пользователем

голоса
24

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

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

Да, сообщение удаляется (ура!). К сожалению, панель уведомлений не обновляется :(

Когда вы откроете в области уведомлений вы увидите сообщение сидит там для вас ... но при нажатии на нее, чтобы открыть его - это пошло!

Для меня это не совсем достаточно хорошо - я хочу, чтобы все следы сообщения исчезнут - я не хочу, чтобы пользователь думает, что есть TXT, когда нет (что бы вызывать только сообщения об ошибках).

Внутренне в ОС телефонных звонков MessagingNotification.updateNewMessageIndicator(Context), но я этот класс был скрыт от API, и я не хочу , чтобы повторить все , что код только ради создания индикатора точной.

Ответил 12/05/2009 d 05:38
источник пользователем

голоса
10
public boolean deleteSms(String smsId) {
    boolean isSmsDeleted = false;
    try {
        mActivity.getContentResolver().delete(Uri.parse("content://sms/" + smsId), null, null);
        isSmsDeleted = true;

    } catch (Exception ex) {
        isSmsDeleted = false;
    }
    return isSmsDeleted;
}

использовать это разрешение в AndroidManifiest

<uses-permission android:name="android.permission.WRITE_SMS"/>
Ответил 15/12/2012 d 19:54
источник пользователем

голоса
6

Его лучше использовать _id и номер_потока, чтобы удалить сообщение.

Thread_id что-то назначено на сообщения, приходящие от того же пользователя. Таким образом, если вы используете только thread_id все сообщения от отправителя будут удалены.

Если и использовать комбинацию _ID, thread_id, то он удалит точное сообщение, которое вы ищете, чтобы удалить.

Uri thread = Uri.parse( "content://sms");
int deleted = contentResolver.delete( thread, "thread_id=? and _id=?", new String[]{String.valueOf(thread_id), String.valueOf(id)} );
Ответил 16/08/2011 d 13:56
источник пользователем

голоса
5

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

Вот еще информация .

Ответил 08/01/2009 d 22:23
источник пользователем

голоса
2

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

public void delete_thread(String thread) 
{ 
  Cursor c = getApplicationContext().getContentResolver().query(
  Uri.parse("content://sms/"),new String[] { 
  "_id", "thread_id", "address", "person", "date","body" }, null, null, null);

 try {
  while (c.moveToNext()) 
      {
    int id = c.getInt(0);
    String address = c.getString(2);
    if (address.equals(thread)) 
        {
     getApplicationContext().getContentResolver().delete(
     Uri.parse("content://sms/" + id), null, null);
    }

       }
} catch (Exception e) {

  }
}

Вызов этой функции просто ниже:

delete_thread("54263726");//you can pass any number or thread id here

Не забудьте добавить андроид разрешения MainFest ниже:

<uses-permission android:name="android.permission.WRITE_SMS"/>
Ответил 15/03/2014 d 13:53
источник пользователем

голоса
2

Я не мог заставить его работать, используя решение 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, прежде чем они поступают в систему, прежде чем он даже достигает почтового ящика. Тем не менее, я очень сомневаюсь, что это выполнимо. Пожалуйста, поправьте меня, если я ошибаюсь.

Ответил 12/06/2009 d 14:08
источник пользователем

голоса
2

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

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

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

Ответил 08/06/2009 d 14:56
источник пользователем

голоса
1

Теперь abortBroadcast();метод может быть использован для ограничения входящего сообщения для перехода на почтовый ящик.

Ответил 03/07/2012 d 13:19
источник пользователем

голоса
1

Также обновить файл манифеста удалить смс вам нужны права на запись.

<uses-permission android:name="android.permission.WRITE_SMS"/>
Ответил 08/08/2011 d 13:11
источник пользователем

голоса
1

Просто взгляните на эту ссылку, он даст вам краткое представление о логике:

https://gist.github.com/5178e798d9a00cac4ddb
Просто вызовите функцию deleteSMS () с некоторой задержкой, потому что есть небольшая разница между временем уведомления и при его сохранении на самом деле ...., подробно взглянуть на эту ссылку тоже ..........

http://htmlcoderhelper.com/how-to-delete-sms-from- Входящие в-андроид-программного /

Спасибо ..........

Ответил 27/12/2010 d 11:10
источник пользователем

голоса
1

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

Ответил 21/06/2010 d 18:34
источник пользователем

голоса
0
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    SMSData sms = (SMSData) getListAdapter().getItem(position);
    Toast.makeText(getApplicationContext(), sms.getBody(),
            Toast.LENGTH_LONG).show();
    Toast.makeText(getApplicationContext(), sms.getNumber(),
            Toast.LENGTH_LONG).show();

    deleteSms(sms.getId());

}

public boolean deleteSms(String smsId) {
    boolean isSmsDeleted = false;
    try {
        MainActivity.this.getContentResolver().delete(
                Uri.parse("content://sms/" + smsId), null, null);
        isSmsDeleted = true;

    } catch (Exception ex) {
        isSmsDeleted = false;
    }
    return isSmsDeleted;
}
Ответил 14/10/2013 d 10:29
источник пользователем

голоса
0

Попробуйте это я 100% уверен, что это будет работать нормально: - // просто поместить адрес преобразования здесь для удаления всего преобразования по адресу (не забыли добавить чтение, запись разрешения в MainFest) Вот код:

String address="put address only";

Cursor c = getApplicationContext().getContentResolver().query(Uri.parse("content://sms/"), new String[] { "_id", "thread_id", "address", "person", "date", "body" }, null, null, null);

try {
    while (c.moveToNext()) {
        int id = c.getInt(0);
        String address = c.getString(2);
        if(address.equals(address)){
        getApplicationContext().getContentResolver().delete(Uri.parse("content://sms/" + id), null, null);}
    }
} catch(Exception e) {

}
Ответил 03/09/2013 d 12:36
источник пользователем

голоса
0

Используйте один из этого метода для выбора последнего принятого SMS и удалить его, здесь, в этом случае я получаю топ большинство смс и собираюсь удалить, используя нить и значение ID смс,

try {
    Uri uri = Uri.parse("content://sms/inbox");
    Cursor c = v.getContext().getContentResolver().query(uri, null, null, null, null);
    int i = c.getCount();

    if (c.moveToFirst()) {
    }
} catch (CursorIndexOutOfBoundsException ee) {
    Toast.makeText(v.getContext(), "Error :" + ee.getMessage(), Toast.LENGTH_LONG).show();
}
Ответил 10/12/2012 d 19:06
источник пользователем

голоса
0

Образец для удаления одного SMS, а не разговор:

getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadID), "_id = ?", new String[]{id});
Ответил 22/01/2011 d 03:37
источник пользователем

голоса
0

Вы только попробуйте следующее code.It удалит все смс, которые все в телефоне (полученные или отправленные)

Uri uri = Uri.parse("content://sms");

ContentResolver contentResolver = getContentResolver();

Cursor cursor = contentResolver.query(uri, null, null, null,
  null);



while (cursor.moveToNext()) {

 long thread_id = cursor.getLong(1);
 Uri thread = Uri.parse("content://sms/conversations/"
   + thread_id);
 getContentResolver().delete(thread, null, null);
}
Ответил 28/12/2010 d 11:44
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more