Android:如何在onReceive中将sms标记为已读

时间:2011-12-26 16:03:16

标签: android sms

我可以捕捉短信,可以看到发件人的电话,正文,如果我不喜欢这个短信,我可以中止广播,但我不知道如何将这个短信标记为已读,该用户可以稍后在框中读取。 我有什么想法可以做到这一点吗?

5 个答案:

答案 0 :(得分:27)

这可能会对您有所帮助:

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

答案 1 :(得分:9)

由于Android 4.4 KitKat唯一的应用程序可以修改短信数据 - 设置为默认的短信应用

  

只有接收SMS_DELIVER_ACTION广播的应用程序(用户指定的默认SMS应用程序)才能写入由android.provider.Telephony类和子类定义的SMS提供程序

可以在此处找到更多信息:http://android-developers.blogspot.ru/2013/10/getting-your-sms-apps-ready-for-kitkat.html

答案 2 :(得分: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!

答案 3 :(得分:0)

我不认为对此有任何官方支持,但这个问题提供了一种方法(尽管没有尝试过):Mark MMS as read programmatically

答案 4 :(得分:0)

我为回答here的新版KitKat做了一个更好的工作:如果有要阅读的消息,当用户离开应用程序时,启动短信应用程序,其中包含我希望消息标记为读取的数字。这将自动将所有消息标记为已读。

@Override
public void onBackPressed() {
  if (toBeRead) {
    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.setType("vnd.android-dir/mms-sms");
    smsIntent.putExtra("address", smsNumber);
    try {startActivity(smsIntent);}
    catch (Exception e) {
      try {
        Intent intent = new Intent(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("smsto:" + Uri.encode(smsNumber)));
        startActivity(intent);
      }
      catch (Exception e1) {}
    }
    toBeRead = false;
  }
}