如果本机(电话)中存在3条未读短消息,并且用户已阅读其中一条短消息。如何在我们的应用程序中识别哪些SMS被读取(从本机)。
目前我正在使用ContentObserver,当用户从本机(手机)读取短信时,会调用onChange()方法。
我可以收到所有未读的短信:
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:
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客户端”。
发布于 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权限的限制而具有系统权限。
https://stackoverflow.com/questions/19333961
复制相似问题