首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果手机(本机)中存在多条未读短信,如何通知从本机(手机)读取了哪条短信?

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

Stack Overflow用户
提问于 2013-10-12 20:02:44
回答 1查看 4K关注 0票数 2

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

目前我正在使用ContentObserver,当用户从本机(手机)读取短信时,会调用onChange()方法。

我可以收到所有未读的短信:

代码语言:javascript
复制
Cursor cursor = this.getContentResolver().query(Uri.parse("content://sms/"), null, "read = 0", null, null);

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

在Nexus4(Android4.3)-API18)中,如果Android Native Sms客户端中两条未读短信(属于两个不同发送者)的通知(在设备状态栏中),用户点击该通知,onChange(context,uri)就会在我的应用程序中被调用,在它里面,我试图获取已读短信的id:

代码语言:javascript
复制
String id = uri.getLastPathSegment();

对于上面提到的情况,"inbox“作为"id”的值出现。但是对于用户在Android Native SMS客户端中读取任何Sms,不调用onChange(context,uri)方法。

在三星Galaxy S3(安卓4.1.2 -API16)中,onChange(上下文,uri)在任何一种情况下都不会被调用(即,如果用户从本地短信读取短信,或者用户在安卓本地短信客户端中点击两条未读短信(属于两个不同的发送方)的通知(在设备状态栏中)。

(在API16中,当在本地接收到新的短信时,onChange(context,uri)被调用," ID“的值等于Nexus4(Android4.3)上测试的短信的唯一ID)

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

EN

回答 1

Stack Overflow用户

发布于 2013-10-18 09:35:42

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

希望在Android4.4中即将发布的changes to the SMS APIs that Google is promising能够让隐藏的API和内容提供商的使用变得不必要。

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

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

然而,这可能并不总是可靠的,并且不会在安卓4.1+设备上工作,除非你的应用程序由于API级别16中对READ_LOGS权限的限制而具有系统权限。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19333961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档