0

我正在尝试统计用户发送的传出 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://smscontent://sms/sent相关的 StackOverflow 问答建议,但是当我使用该设置运行应用程序时,它甚至不会执行我的内容观察者的onChange(). 我该怎么办?

4

2 回答 2

0

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

MMS App 每次排队后都会更改 TYPE 列。

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

于 2012-08-16T12:09:20.983 回答
0

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

// 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 的一部分,但可以在此处找到。

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

于 2012-08-20T08:01:08.453 回答