2010-02-02 35 views
5

Có nhiều câu hỏi về nó, không có câu trả lời nào đang hoạt động trong ứng dụng của tôi :(Xóa SMS trong Android 1.5

Tôi cần xóa SMS khỏi người nhận, ngay cả khi người dùng có thể nhìn thấy, nhưng phải xóa lập trình.

làm thế nào tôi có thể làm điều đó?

các phù hợp nhất mà tôi đã sử dụng là những điều sau đây, nhưng nó không hoạt động :(

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

Trả lời

9

Sau refactoring mã của tôi tôi thấy làm việc rằng giải pháp tiếp theo:

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

Cảm ơn tất cả mọi người giúp đỡ!

ps nếu mã này hữu ích cho một số người - hãy nhớ rằng bắt (Ngoại lệ) không tốt.

+3

hiện điều này xóa một tin nhắn duy nhất hoặc toàn bộ một cuộc trò chuyện? Tại sao tin nhắn SmsMessage được lấy như một tham số khi nó không có t được sử dụng bất cứ nơi nào trong phương pháp? –

2

liên kết này có thể hữu ích

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

tôi đã không thực hiện đầy đủ nó bản thân mình nhưng những gì tôi đã thực hiện các công trình

Lưu ý rằng nó không phải là tài liệu đầy đủ và do đó có thể thay đổi trong các phiên bản tương lai của Android

EDIT:

Đây là cách tôi tự triển khai mã:

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

} 


} 

Mã này lắng nghe những thay đổi trong Nhà cung cấp nội dung SMS.

Đây là dòng bạn sẽ quan tâm đến nếu bạn muốn xóa một tin nhắn SMS

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

Bạn phải xóa toàn bộ cuộc nói chuyện để xóa các tin nhắn SMS, tôi đã không thể chỉ cần xóa cuối cùng tin nhắn của cuộc hội thoại

+0

Cảm ơn! Hữu ích của nó, nhưng nó không làm việc cho tôi: (Có lẽ nó không hoạt động chỉ trong giả lập ... tôi không có ý tưởng phải làm gì nhiều hơn nữa ...:( – Dmytro

+0

Tôi đã thêm phần triển khai mã của mình ở trên bao gồm cách tôi xóa cuộc trò chuyện SMS, có thể sử dụng –

3

Giá trị của deleteUri là gì?

Bạn có chắc chắn rằng SMS đã được ghi vào bộ nhớ cục bộ trước bạn đang cố gắng xóa nó? Nếu bạn đang xử lý phát sóng SMS_RECEIVED, không đảm bảo rằng SMS sẽ được xử lý bằng ứng dụng SMS gốc ...

Ngoài ra, tôi sẽ lưu ý rằng API nhà cung cấp nội dung SMS không được tài liệu công khai bởi Android và có thể bị thay đổi trong tương lai. Nhưng nếu bạn chỉ nhắm mục tiêu Android 1.5 (hoặc các thiết bị hiện tại), thì bạn có thể ổn.

+0

tôi đã thử nội dung: // sms và nội dung: // sms/inbox Tôi đang thử xóa bằng cách trì hoãn mỗi 5 giây để bảo đảm nó được lưu trong lưu trữ, btw tôi đọc nó đầu tiên! nó in trong các bản ghi tốt! nhưng không xóa: ( – Dmytro

+0

'nội dung: // sms' có vẻ tốt. Bạn có thể xác minh trong cơ sở dữ liệu SQLite rằng các giá trị bạn đang truy cập vào truy vấn giống như những gì được lưu trữ trong cơ sở dữ liệu? Làm cách nào để xác minh rằng thư đó không bị xóa? –

+0

Thực ra tôi đã thực hiện các truy vấn trễ về việc chọn thư cũng có thể thấy chúng trong "Thư" qua Bây giờ nó hoạt động tốt, tôi đã đăng giải pháp tôi tìm thấy – Dmytro

1

sử dụng này và được chàng trai hạnh phúc

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

omg, hãy định dạng –

4

Chỉ cần sử dụng mã đơn giản này trong máy thu phát sóng của bạn.

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()); 
    } 
Các vấn đề liên quan