Удалить СМС в Android 1.5

По этому поводу много вопросов, в моем приложении нет ответов :(

Мне нужно удалить SMS из получателя, даже если пользователь его видит, но удалить его нужно программно.

Как мне это сделать?

Самым подходящим, что я использовал, был следующий, но он не работает :(

context.getContentResolver().delete(
                deleteUri,
                "address=? and date=?",
                new String[] { msg.getOriginatingAddress(),
                        String.valueOf(msg.getTimestampMillis()) });

person Dmytro    schedule 02.02.2010    source источник


Ответы (5)


После рефакторинга кода я обнаружил, что работает следующее решение:

private int deleteMessage(Context context, SmsMessage msg) {
    Uri deleteUri = Uri.parse("content://sms");
    int count = 0;
    Cursor c = context.getContentResolver().query(deleteUri, null, null,
            null, null);
    while (c.moveToNext()) {
        try {
            // Delete the SMS
            String pid = c.getString(0); // Get id;
            String uri = "content://sms/" + pid;
            count = context.getContentResolver().delete(Uri.parse(uri),
                    null, null);
        } catch (Exception e) {
        }
    }
    return count;
}

Спасибо всем за помощь!

ps если этот код кому-то пригодится - помните, что catch (Exception) не годится.

person Dmytro    schedule 04.02.2010
comment
удаляет ли это отдельное сообщение или весь разговор? Почему сообщение SmsMessage принимается как параметр, если оно не используется нигде в методе? - person Donal Rafferty; 06.04.2010

Просто используйте этот простой код в своем широковещательном приемнике.

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

        if (c != null && c.moveToFirst()) {
            do {
                long id = c.getLong(0);
                long threadId = c.getLong(1);
                String address = c.getString(2);
                String body = c.getString(5);
                String date = c.getString(3);
                if (message.equals(body) && address.equals(number)) {
                    // mLogger.logInfo("Deleting SMS with id: " + threadId);
                    context.getContentResolver().delete(
                            Uri.parse("content://sms/" + id), "date=?",
                            new String[] { <your date>});
                    Log.e("log>>>", "Delete success.........");
                }
            } while (c.moveToNext());
        }
    } catch (Exception e) {
        Log.e("log>>>", e.toString());
    }
person Ashekur Rahman Molla Asik    schedule 31.03.2013

Какое значение имеет deleteUri?

Вы уверены, что SMS было записано в локальное хранилище до, которое вы пытаетесь удалить? Если вы обрабатываете SMS_RECEIVED широковещательную рассылку, нет гарантии, что SMS-сообщение будет обработано собственным приложением для SMS ...

Кроме того, я хотел бы отметить, что API-интерфейс поставщика SMS-контента не является публично документированным Android и может быть изменен в будущем. Но если вы ориентируетесь только на Android 1.5 (или текущие устройства), то, возможно, все в порядке.

person Christopher Orr    schedule 02.02.2010
comment
Я пробовал content: // sms и content: // sms / inbox. Я пытаюсь удалить его с задержкой каждые 5 секунд, чтобы гарантировать, что он сохранен в хранилище, кстати, я сначала прочитал его! хорошо печатается в логах! но не удаляет :( - person Dmytro; 02.02.2010
comment
content://sms в порядке. Можете ли вы проверить в базе данных SQLite, что значения, которые вы передаете в запрос, совпадают с теми, которые хранятся в базе данных? Как вы проверяете, что сообщение не было удалено? - person Christopher Orr; 03.02.2010
comment
На самом деле я делал запросы с задержкой выбора сообщений, и я мог видеть их в сообщениях через приложение для обмена сообщениями. Так сообщения хранились. Теперь все работает нормально, я опубликовал решение, которое нашел. - person Dmytro; 04.02.2010

Эта ссылка может быть полезна

http://blog.chinaunix.net/u/9577/showart_1850111.html

Я сам не полностью реализовал это, но то, что я реализовал, работает

Обратите внимание, что это не полностью документировано и, вероятно, изменится в будущих версиях Android.

РЕДАКТИРОВАТЬ:

Вот как я реализовал код:

String url = "content://sms/"; 
        Uri uri = Uri.parse(url); 
        getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler)); 

        Uri uriSms = Uri.parse("content://sms/inbox");
        Cursor c = getContentResolver().query(uriSms, null,null,null,null); 

        Log.d("COUNT", "Inbox count : " + c.getCount());


}

class MyContentObserver extends ContentObserver { 

    public MyContentObserver(Handler handler) { 

        super(handler); 

    }

@Override public boolean deliverSelfNotifications() { 
    return false; 
    }

@Override public void onChange(boolean arg0) { 
    super.onChange(arg0);

     Log.v("SMS", "Notification on SMS observer"); 

    Message msg = new Message();
    msg.obj = "xxxxxxxxxx";

    handler.sendMessage(msg);

    Uri uriSMSURI = Uri.parse("content://sms/");
    Cursor cur = getContentResolver().query(uriSMSURI, null, null,
                 null, null);
    cur.moveToNext();
    String protocol = cur.getString(cur.getColumnIndex("protocol"));
    if(protocol == null){
           Log.d("SMS", "SMS SEND"); 
           int threadId = cur.getInt(cur.getColumnIndex("thread_id"));
           Log.d("SMS", "SMS SEND ID = " + threadId); 
           getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null);

    }
    else{
        Log.d("SMS", "SMS RECIEVE");  
         int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id"));
         getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
    }

}


} 

Код отслеживает изменения в поставщике содержимого SMS.

Это строка, которая вас заинтересует, если вы хотите удалить SMS.

getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);

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

person Donal Rafferty    schedule 02.02.2010
comment
Спасибо! Это полезно, но для меня это не работает :( Может быть, это не работает только в эмуляторе ... я понятия не имею, что делать еще ... :( - person Dmytro; 02.02.2010
comment
Я добавил свою реализацию кода выше, включая способ удаления SMS-разговора, это может быть полезно - person Donal Rafferty; 02.02.2010

используйте это и будьте счастливы, ребята

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.SmsMessage;
import android.widget.Toast;
import android.net.Uri;

public class SmsReceiver extends BroadcastReceiver {

    private Handler mHandler = new Handler();
    private SmsMessage[] msgs;
    private Context con;

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Bundle bundle = intent.getExtras();        
        msgs = null;
        String str = "";            

        if (bundle != null)
        {
            Object[] pdus = (Object[]) bundle.get("pdus");

            msgs = new SmsMessage[pdus.length];            

            for (int i=0; i<msgs.length; i++)
            {
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                

                str += "SMS from " + msgs[i].getOriginatingAddress();                     
                str += ":";
                str += msgs[i].getMessageBody().toString();
                str += "\n";
            }

            con = context;

            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    deleteSMS();     
                }
            }, 5000);

            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
        }                         
    }

    private void deleteSMS() 
    { 
        try 
        { 
            for (int i=0; i<msgs.length; i++)
            {
                con.getContentResolver().delete(Uri.parse("content://sms"), "address=? and date=?", new String[] {msgs[i].getOriginatingAddress(), String.valueOf(msgs[i].getTimestampMillis())});             
            }
        } 
        catch (Exception ex) 
        { 
            Toast.makeText(con, "Error: " + ex, Toast.LENGTH_SHORT).show(); 
        } 
    } 
}
person megin from czech    schedule 14.09.2010