如果手机(本机)中存在多个未读短信,如何通知从本机(手机)读取了哪些短信?

Posted

技术标签:

【中文标题】如果手机(本机)中存在多个未读短信,如何通知从本机(手机)读取了哪些短信?【英文标题】:How to get notify which SMS got read from native(phone) if multiple unread SMS are present in phone(native)? 【发布时间】:2013-10-20 11:13:29 【问题描述】:

如果本地(电话)中存在 3 条未读短信,并且用户已阅读其中一条短信。如何识别在我们的应用程序中(从本机)读取了哪些 SMS。

目前我正在使用 ContentObserver 并且当用户从本机(电话)读取 SMS 时调用 onChange() 方法。

我能够收到所有未读短信:

Cursor cursor = this.getContentResolver().query(Uri.parse("content://sms/"), null, "read = 0", null, null);

如何识别从本机(手机)读取的短信。任何帮助或指导将不胜感激。

在 Nexus 4(android 4.3) - API 18) 中,如果 Android Native Sms Client 中两条未读短信(属于两个不同的发件人)的通知(在设备状态栏中),用户点击该通知,onChange(context, uri ) 在我的应用程序中被调用,在其中我试图获取已读 SMS 的 id:

String id = uri.getLastPathSegment();

对于上述情况,“收件箱”作为“id”的值来了。但是对于用户从 Android Native Sms Client 中读取任何 SMS,不会调用 onChange(context, uri) 方法。

在三星 Galaxy S3(Android 4.1.2 - API 16) 中,onChange(context, uri) 在任何一种情况下都不会被调用(即,如果用户从 Native 读取 SMS 或用户点击通知(在Android Native Sms Client 中两条未读短信(属于两个不同的发件人)的设备状态栏)。

(在 API 16 中,当以原生方式接收到新 SMS 时,会调用 onChange(context, uri) 并且“id”的值等于该 SMS 的唯一 ID - 在 Nexus 4(Android 4.3) 上测试)

注意:这里的“来自本地”是指“来自设备的默认短信客户端”。

【问题讨论】:

您有 3 条未读短信,而您已阅读其中一条。如何识别最后一条标记的短信?如果这是您的问题,那么为什么不能取所有“读取”短信的光标的最后一个元素?不知道这是否对您有帮助:( PS 尝试通过 Thread_id 或 _id 排序 【参考方案1】:

要确定哪条消息已从未读变为已读,您可能必须在您自己的数据结构中跟踪所有未读消息的状态,并在您的 Content Observer 检测到的每个 onChange 期间进行比较,以确定哪些/是否有任何消息发生了变化阅读状态。您可以通过在 Content Resolver 查询中包含额外的投影和选择参数来将数据集缩小到感兴趣的字段,从而提高性能。

希望 Android 4.4 中即将推出的changes to the SMS APIs that Google is promising 将不再需要使用隐藏的 API 和内容提供程序来实现这些目的。

您还可以通过查找由本机消息传递应用程序使用的com.android.mms.data.Conversation 类生成的 markAsRead 调试消息来确定已读取的 SMS(或至少是线程):

D/Mms (1645): [192] markAsRead: update read/seen for thread uri: content://mms-sms/conversations/4

但是,由于 API 级别 16 中对 READ_LOGS 权限的限制,除非您的应用具有系统权限,否则这可能并不总是可靠且无法在 Android 4.1+ 设备上运行。

【讨论】:

嗨 iryanmac,非常感谢您的建议。我已按照您的建议在您自己的数据结构中跟踪所有未读消息的状态,并且它适用于低于 4.1 的 Android 版本。请指导我使用Android 4.1+版本(我已经更新了问题的内容) 嗨,abhishek,很高兴为您提供帮助。我在运行 Android 4.1 的 GS3 上测试了我在您的链接问题中提供的代码,并且我收到了预期的 onChange 通知。因此,我建议通过添加适当的调试消息来验证您的内容观察者服务是否已成功创建、注册和启动。然后,如果您仍然没有收到 onChange 通知,您可能需要更改您正在监视更改的 URI(例如,使用 content://mms-sms/conversations/ 而不是 content://sms/)或扩大/删除您在查询中使用的选择标准。 谢谢我使用 content://mms-sms/conversations/ 而不是 content://sms/。这正在工作。

以上是关于如果手机(本机)中存在多个未读短信,如何通知从本机(手机)读取了哪些短信?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不点击通知的情况下从通知中获取数据(firebase 云消息传递和本机反应)

React 本机通知图标不适用于三星

怎么查看苹果手机本机性能

我如何从 laravel api 推送通知以响应本机应用程序?

在一个事件中在后台触发本机 Firebase 多个通知

使用PhoneGap从应用程序发送短信而不打开Android上的本机短信应用程序