【发布时间】:2012-01-28 01:34:50
【问题描述】:
我可以收到短信,可以看到发件人电话,身体,如果我不喜欢这条短信,我可以中止广播,但我不知道如何将这条短信标记为已读,用户可以稍后在框中阅读。 有什么想法可以做到这一点吗?
【问题讨论】:
我可以收到短信,可以看到发件人电话,身体,如果我不喜欢这条短信,我可以中止广播,但我不知道如何将这条短信标记为已读,用户可以稍后在框中阅读。 有什么想法可以做到这一点吗?
【问题讨论】:
这可能对你有帮助:
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());
}
}
【讨论】:
startsWith 而不是equals :cursor.getString(cursor.getColumnIndex("body")).startsWith(body)
自 Android 4.4 KitKat 以来,唯一可以修改短信数据的应用 - 被设置为默认的短信应用
只有接收 SMS_DELIVER_ACTION 广播的应用(用户指定的默认 SMS 应用)才能写入由 android.provider.Telephony 类和子类定义的 SMS Provider
更多信息可以在这里找到:http://android-developers.blogspot.ru/2013/10/getting-your-sms-apps-ready-for-kitkat.html
【讨论】:
这里已经给出了答案: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!
【讨论】:
我不认为对此有任何官方支持,但这个问题提供了一种方法(虽然没有尝试过):Mark MMS as read programmatically
【讨论】:
我为 KitKat 的较新版本做了一个解决方法,来自答案 here:如果有要阅读的消息,当用户离开应用程序时,使用我希望消息标记为已读的号码启动 SMS 应用程序。这将自动将所有消息标记为已读。
@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;
}
}
【讨论】: