2

如果本机(电话)中存在 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)在我的应用程序中,我试图在其中获取已读短信的 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 原生短信客户端中的两条未读短信(属于两个不同的发件人)。

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

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

4

1 回答 1

3

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

希望Google 承诺在 Android 4.4 中即将对 SMS API 进行的更改将使隐藏 API 和 Content Providers 的使用不再需要这些目的。

您还可以通过查找由本机消息传递应用程序使用的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+ 设备上运行,除非您的应用程序具有系统权限。

于 2013-10-18T01:35:42.333 回答