【问题标题】:Android: how to mark sms as read in onReceiveAndroid:如何在 onReceive 中将短信标记为已读
【发布时间】:2012-01-28 01:34:50
【问题描述】:

我可以收到短信,可以看到发件人电话,身体,如果我不喜欢这条短信,我可以中止广播,但我不知道如何将这条短信标记为已读,用户可以稍后在框中阅读。 有什么想法可以做到这一点吗?

【问题讨论】:

    标签: android sms


    【解决方案1】:

    这可能对你有帮助:

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

    【讨论】:

    • 不,只是带有 _id = SmsMessageId 的特定消息
    • 更新查询的返回结果为 0 。这背后的原因是什么?
    • @NameisNilay 为什么在这里使用startsWith 而不是equals :cursor.getString(cursor.getColumnIndex("body")).startsWith(body)
    • 请注意,检查 update() 调用的结果 (int) 应该是 1 更安全。此外,除非您是默认消息传递,否则它可能不会让您这样做手机上的应用?
    【解决方案2】:

    自 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

    【讨论】:

      【解决方案3】:

      这里已经给出了答案: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!

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 想法错误,我在 onReceive 中收到的短信不在“content://sms”中
        【解决方案5】:

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

        【讨论】:

        • 什么是“smsNumber”,它的价值从何而来?它应该等于 _id 列的值吗?还是别的什么?
        • 另外,您确定这适用于当前的 Android 版本吗?看这里:stackoverflow.com/q/19853220/997940
        • @Yoav Feuerstein 好吧,“smsNumber”很清楚它是什么(“您希望消息标记为已读的号码”)。至于其他评论,您是对的,请参阅我的更新答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多