在Jelly Bean中传递给发送短信的ContentObserver的正确URI是什么?

时间:2012-08-16 11:43:35

标签: android sms contentobserver

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

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应用程序发送短信时,它会将我的标记增加三个

现在,我决定将content://sms替换为content://sms/sent作为相关的StackOverflow q& a's建议,但是当我使用该设置运行应用时,从不甚至执行我的内容观察者的onChange()。我该怎么办?

2 个答案:

答案 0 :(得分:0)

当db updater调用您已注册的确切uri时,将调用registerContentObserver上的回调。但在你的情况下,MMS应用程序不使用content:// sms / sent但使用类似content://sms/10的内容并继续将其从类型QUEUED移动到OUTBOX然后再移动到SENT。所以我想这就是为什么当你注册content://sms/

时你收到3个更新的原因

MMS应用程序每次排队后都会更改TYPE列。

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

答案 1 :(得分:0)

根据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被发送到多个收件人时,Android会对单个发送的短信进行不准确的计数(发送给两个人计数三个,发送到三个计数5)。即使您过滤掉消息类型,内容观察器似乎也会被调用多次,即使只有一条消息也是如此。我修复后会发布这个答案的更新。