Android失败的短信观察员

时间:2015-10-13 02:28:14

标签: java android sms contentobserver

我正在尝试编写一个Android服务应用程序,它拦截失败的传出短信息(由于服务不可用)来存储它们,并在电话服务恢复后尝试重新发送它们。我几乎得到它的工作,但我有这个问题,这不是很容易解释,但我会尝试,希望你明白: 我已经在URI content:// sms上设置了一个ContentObserver,即使我感兴趣的内容是:// sms / failure,因为如果我在最后一个URI上设置它,onChange方法不会被触发,我不会不知道为什么。提供成功发送和接收的消息不会打扰我,因为在观察者的onChange方法中,我只阅读内容中的内容:// sms / failed,这是真正的问题:onChange也会在DELETE事件上触发,当然,例如,在成功发送先前失败的消息的时刻发生。这对我的应用程序来说很糟糕,因为如果我无法区分删除事件和添加事件,我不知道是否必须将失败消息队列中的第一个短信添加到“重新发送”列表中。所以,我的问题是:有没有办法区分删除添加事件与内容观察者?

PS:很高兴理解为什么内容上的ContentObserver:// sms / failed不起作用。

PPS:我还有一个小问题:我正在使用SmsManager重新发送消息,这很好用,唯一的问题是我只能设置目的号码和消息正文,而不是消息的ID,因此,当我怨恨短信时,系统认为它只是一个新的短信而不是旧的短信(因此旧的失败的消息仍然留在队列中,并且不会被系统删除)。

1 个答案:

答案 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,并在成功发送后删除相应的消息。