【问题标题】:What is the correct URI to pass to a ContentObserver for sent SMSes in Jelly Bean?传递给 ContentObserver 以在 Jelly Bean 中发送 SMS 的正确 URI 是什么?
【发布时间】:2012-08-16 11:43:35
【问题描述】:

我正在尝试统计用户发送的外发 SMS 的数量。目前,我的代码是这样的:

class SentSMSObserver extends ContentObserver {
....
}

SentSMSObserver sso = new SentSMSObserver(new Handler());
ContentResolver cr = this.getContentResolver();
cr.registerContentObserver(Uri.parse("content://sms"), true, sso);

我尝试在运行 Jelly Bean 的模拟器中运行该应用,但由于某种原因,当我通过本机 SMS 应用发送短信时,它会将我的计数增加 3

现在,我决定将 content://sms 替换为 content://sms/sent,正如相关 StackOverflow 问答所建议的那样,但是当我使用该设置运行应用程序时,它从不甚至执行我的内容观察者的 @987654325 @。我该怎么办?

【问题讨论】:

  • 你尝试过类似this的方法吗?

标签: android sms contentobserver


【解决方案1】:

当数据库更新程序调用您已注册的确切 uri 时,将调用 registerContentObserver 上的回调。但在您的情况下,彩信应用程序不使用 content://sms/sent ,而是使用 content://sms/10 之类的东西,并不断将其从 QUEUED 类型移至 OUTBOX ,然后移至 SENT 。所以我想这就是为什么您在注册content://sms/ 时会收到 3 个更新

彩信App每次排队后都会改变TYPE列。

解决此问题的一种方法是每次获取uri的内容更改回调查询,然后获取“type”列并检查其值是否为Telephony.Sms.MESSAGE_TYPE_SENT

【讨论】:

  • 虽然我无法导入 Telephony.Sms.MESSAGE_TYPE_SENT,所以我同时将其替换为 2,如下所述:androidjavadoc.com/m5-rc15/… 但是有什么方法可以使用常量代替?
  • 我认为电话是公共 api。我没有意识到它被隐藏了。它相当复杂,但你可以看这里。 devmaze.wordpress.com/2011/01/18/…
  • 这似乎不是一个非常好的和安全的编程实践,所以我想我会在此期间坚持使用== 2,正如 Lalit Poptani 在上面的评论中所建议的那样。
【解决方案2】:

从 Lalit Poptani 建议的answer 中,您需要获取光标当前指向的记录的“类型”的值。

// cr is the content resolver
Cursor cursor = cr.query(Uri.parse("content://sms"), null, null, null, null);
int columnIndex = cursor.getColumnIndex("type");

while (cursor.moveToNext()) {
    int type = cursor.getInt(columnIndex);
    if (type == 2) {
        // do your stuff here
    }
}

正如我在与 nandeesh 的讨论中提到的,消息类型不是公共 API 的一部分,但可以在 here 找到它们。

目前,我正在修复一个错误,即当 Android 将一条发送的 SMS 消息定向到多个收件人时(发送给两个人计为 3,发送给三个人计为 5),Android 对发送的单条 SMS 消息的计数不准确。似乎即使您过滤掉了消息类型,内容观察者也会被多次调用,即使只是一条消息。修复后,我将发布对此答案的更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 2011-03-23
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2011-11-01
    • 2017-01-25
    相关资源
    最近更新 更多