我正在尝试计算用户发送的外发短信的数量。目前,我的代码是这样的:
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()
。我该怎么办?
答案 0 :(得分:0)
当db updater调用您已注册的确切uri时,将调用registerContentObserver上的回调。但在你的情况下,MMS应用程序不使用content:// sms / sent但使用类似content://sms/10
的内容并继续将其从类型QUEUED移动到OUTBOX然后再移动到SENT。所以我想这就是为什么当你注册content://sms/
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)。即使您过滤掉消息类型,内容观察器似乎也会被调用多次,即使只有一条消息也是如此。我修复后会发布这个答案的更新。