【问题标题】:Delete SMS in Android 1.5在 Android 1.5 中删除短信
【发布时间】:2010-02-02 11:37:11
【问题描述】:

有很多关于它的问题,在我的应用程序中没有答案:(

我需要从接收器中删除 SMS,即使用户可以看到它,但必须以编程方式将其删除。

我该怎么做?

我用过的最合适的是下面这个,但是不行:(

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

【问题讨论】:

    标签: java android sms


    【解决方案1】:

    重构我的代码后,我发现下一个解决方案有效:

    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) 不好。

    【讨论】:

    • 这会删除一条消息还是整个对话?为什么在方法的任何地方都没有使用 SmsMessage msg 作为参数?
    【解决方案2】:

    只需在广播接收器中使用这个简单的代码。

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

    【讨论】:

      【解决方案3】:

      deleteUri 的值是多少?

      您确定在您尝试删除 SMS 之前 已将 SMS 写入本地存储吗?如果您正在处理SMS_RECEIVED 广播,则不能保证本机短信应用程序已经处理了短信...

      另外,我要指出的是,Android 并未公开记录 SMS 内容提供程序 API,并且将来可能会发生变化。但如果您只针对 Android 1.5(或当前设备),那么您可能没问题。

      【讨论】:

      • 我已经尝试过 content://sms 和 content://sms/inbox 我正在尝试每 5 秒延迟一次删除它,以保证它保存在存储中,顺便说一句,我先阅读它!它可以很好地打印在日志中!但不删除:(
      • content://sms 看起来不错。您能否在 SQLite 数据库中验证您传递给查询的值是否与存储在数据库中的值相同?您如何确认邮件未被删除?
      • 实际上我对消息的选择进行了延迟查询,我也可以通过消息应用程序在“消息”中看到它们。所以消息被存储了。现在它工作正常,我已经发布了我找到的解决方案。
      【解决方案4】:

      此链接可能有用

      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 Content Provider 中的变化。

      如果您想删除短信,您会感兴趣的这条线

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

      你必须删除整个对话才能删除短信,我无法只删除对话的最后一条消息

      【讨论】:

      • 谢谢!它很有用,但对我不起作用:(也许它仅在模拟器中不起作用...我不知道该怎么做... :(
      • 我已经添加了上面代码的实现,包括我如何删除短信对话,它可能有用
      【解决方案5】:

      使用它,快乐的人

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

      【讨论】:

        猜你喜欢
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多