2011-12-26 41 views

回答

23

这可以帮助你:

private void markMessageRead(Context context, String number, String body) { 

      Uri uri = Uri.parse("content://sms/inbox"); 
      Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); 
      try{ 

      while (cursor.moveToNext()) { 
        if ((cursor.getString(cursor.getColumnIndex("address")).equals(number)) && (cursor.getInt(cursor.getColumnIndex("read")) == 0)) { 
         if (cursor.getString(cursor.getColumnIndex("body")).startsWith(body)) { 
          String SmsMessageId = cursor.getString(cursor.getColumnIndex("_id")); 
          ContentValues values = new ContentValues(); 
          values.put("read", true); 
          context.getContentResolver().update(Uri.parse("content://sms/inbox"), values, "_id=" + SmsMessageId, null); 
          return; 
         } 
        } 
       } 
     }catch(Exception e) 
     { 
      Log.e("Mark Read", "Error in Read: "+e.toString()); 
     } 
} 
+0

这是读取框中还是特定的所有消息 – Prasad 2015-07-16 09:44:19

+1

不,只是具有_id = SmsMessageId的特定消息 – 2015-07-16 11:46:16

+0

更新查询的返回结果为0。这背后的原因是什么? – 2015-09-30 05:22:35

0

我不认为有这方面的任何官方的支持,但这个问题提供了做这件事的方法(还没有尝试过,虽然):Mark MMS as read programmatically

+0

错误的想法,短信说我赶上的onReceive是不是在“内容://短信” – 2011-12-27 03:14:15

+0

@安德鲁 - 它应该是“内容://短信/收件箱” .. – 2012-08-03 09:22:25

6

的答案已经在这里给出:Set sms as read in Android

ContentValues values = new ContentValues(); 
values.put("read",true); 
getContentResolver().update(Uri.parse("content://sms/inbox"),values, 
    "_id="+SmsMessageId, null); 

其中 “_id” 是消息的ID

编辑,感谢NilayOnAndroid!

+0

它应该是“内容:// sms/inbox“.. – 2012-08-03 09:21:58

0

我做了较新的版本的奇巧,从答案here一个workarround:如果有要读取的消息,当用户离开应用程序,开始与我所要的号码的短信应用标记读取的消息。这会自动将所有消息标记为已读。

@Override 
public void onBackPressed() { 
    if (toBeRead) { 
    Intent smsIntent = new Intent(Intent.ACTION_VIEW); 
    smsIntent.setType("vnd.android-dir/mms-sms"); 
    smsIntent.putExtra("address", smsNumber); 
    //smsIntent.putExtra("sms_body","Body of Message"); 
    startActivity(smsIntent); 
    toBeRead = false; 
    } 
}