我正在尝试编写一个Android服务应用程序,它拦截失败的传出短信息(由于服务不可用)来存储它们,并在电话服务恢复后尝试重新发送它们。我几乎得到它的工作,但我有这个问题,这不是很容易解释,但我会尝试,希望你明白: 我已经在URI content:// sms上设置了一个ContentObserver,即使我感兴趣的内容是:// sms / failure,因为如果我在最后一个URI上设置它,onChange方法不会被触发,我不会不知道为什么。提供成功发送和接收的消息不会打扰我,因为在观察者的onChange方法中,我只阅读内容中的内容:// sms / failed,这是真正的问题:onChange也会在DELETE事件上触发,当然,例如,在成功发送先前失败的消息的时刻发生。这对我的应用程序来说很糟糕,因为如果我无法区分删除事件和添加事件,我不知道是否必须将失败消息队列中的第一个短信添加到“重新发送”列表中。所以,我的问题是:有没有办法区分删除添加事件与内容观察者?
PS:很高兴理解为什么内容上的ContentObserver:// sms / failed不起作用。
PPS:我还有一个小问题:我正在使用SmsManager重新发送消息,这很好用,唯一的问题是我只能设置目的号码和消息正文,而不是消息的ID,因此,当我怨恨短信时,系统认为它只是一个新的短信而不是旧的短信(因此旧的失败的消息仍然留在队列中,并且不会被系统删除)。
答案 0 :(得分:0)
...有没有办法区分删除添加事件与内容观察者?
查询传递给onChange()
方法的URI。如果Cursor为空 - 即getCount()
返回0
- 那么它就是删除。例如:
public void onChange(boolean selfChange, Uri uri)
{
boolean deletion = false;
Cursor cursor = getContentResolver().query(uri, null, null,
null, null);
if(cursor != null)
deletion = cursor.getCount() == 0;
else
return;
...
}
很高兴理解为什么内容上的ContentObserver:// sms / failed不起作用。
这就是SMS ContentProvider的实现方式。您无法获得比content://sms
更具体的内容。
我有另一个小问题......
邮件的ID由ContentProvider分配,您的应用最快可以知道其值在onChange()
方法中。您无法控制ID的分配,因此您的应用必须自己跟踪失败的消息ID,并在成功发送后删除相应的消息。