Java Android失败的短信观察者

Java Android失败的短信观察者,java,android,sms,contentobserver,Java,Android,Sms,Contentobserver,我正在尝试编写一个Android服务应用程序,它可以截取失败的发送短信(由于服务不可用)来存储它们,并在手机服务恢复后尝试重新发送它们。我差一点就成功了,但我有一个问题,这个问题不容易解释,但我会尝试,希望你能理解: 我已经在URI上设置了ContentObservercontent://sms 即使我感兴趣的是content://sms/failure 因为如果我在最后一个URI上设置它,onChange方法不会被触发,我也不知道为什么。如果成功发送和接收消息,我不会感到困扰,因为在obser

我正在尝试编写一个Android服务应用程序,它可以截取失败的发送短信(由于服务不可用)来存储它们,并在手机服务恢复后尝试重新发送它们。我差一点就成功了,但我有一个问题,这个问题不容易解释,但我会尝试,希望你能理解: 我已经在URI上设置了ContentObservercontent://sms 即使我感兴趣的是content://sms/failure 因为如果我在最后一个URI上设置它,onChange方法不会被触发,我也不知道为什么。如果成功发送和接收消息,我不会感到困扰,因为在observer的onChange方法中,我只读取了中的内容content://sms/failed,这才是真正的问题:onChange当然也会在DELETE事件中触发,例如,在成功发送之前失败的消息的瞬间。这对我的应用程序不利,因为如果我无法区分删除事件和添加事件,我不知道是否必须将失败消息队列中的第一条短信添加到“重新发送”列表中。所以,我的问题是:有没有一种方法可以区分删除和添加事件与内容观察者

PS:如果能理解为什么一个ContentObservercontent://sms/failed 不起作用

PPS:我还有一个小问题:我正在使用SmsManager重新发送消息,它工作正常,唯一的问题是我只能设置消息的目的地号码和正文,但不能设置消息的ID,因此当我重新发送一条短信时,系统会认为它只是一条新短信,而不是正在重新发送的旧短信(因此旧的失败消息保留在队列中,不会被系统删除)

…是否有方法区分删除事件和添加事件与内容观察者

查询传递到
onChange()
方法中的URI。如果光标为空,即
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;

    ...
}
如果能理解为什么一个ContentObservercontent://sms/failed 不起作用

这就是SMS ContentProvider的实现方式。除了
content://sms

我还有一个小问题

消息ID由ContentProvider分配,应用程序最快知道其值的方法是
onChange()
方法。您无法控制ID的分配,因此应用程序必须跟踪失败的消息ID本身,并在成功发送后删除相应的消息

…是否有方法区分删除事件和添加事件与内容观察者

查询传递到
onChange()
方法中的URI。如果光标为空,即
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;

    ...
}
如果能理解为什么一个ContentObservercontent://sms/failed 不起作用

这就是SMS ContentProvider的实现方式。除了
content://sms

我还有一个小问题


消息的ID由ContentProvider分配,应用程序最快可以知道它的值在
onChange()中“太长了,读不下去了。”太长了,读不下去了。han 1查询结果中的消息。每当截获失败消息时,我只读取查询的第一个结果,因为对于每个新的失败消息事件,都会生成一个对onChange的新调用,因此无需读取多个条目。第二个答案是确定的。对于最后一个答案,我已经知道我可以在onChange方法中获取SMS id,并且事实上我知道。我不知道如何从网络上删除短信content://sms/failed 尽管如此。1)您不应该在查询结果中获得多条消息。2) 这就是你的应用程序必须跟踪的内容——失败发送的ID/URI。成功发送后,
delete()
保存的URI。我现在意识到我在回答的第一部分可能不太清楚。我认为您可能使用了错误的查询,因此我添加了一个示例。如果我不知道你的应用程序是如何运行的,我就不能对我的答案的最后一部分更具体了。我使用了与你完全相同的查询。问题是我已经检查cur.getCount()==0,当发生删除时它不是真的。在进行调试时,我可以看到cur.getCount()等于content://SMS/failed. 因此,例如,如果在我安装应用程序之前系统中(我的意思是在android系统中)有失败的消息,cur.getCount()将始终计算这些消息。现在我不在我的电脑上,一旦我找到它,如果还需要的话,我会发布一些代码。是的,它们都有一个指定的_id。但我的问题不是如何通过_id删除重新发送的消息,真正的问题是当发生删除时(我指的是用户在sms应用程序中手动执行的任何删除操作),onChange方法被触发,无法理解该调用是删除还是新的失败sms传出。下面是我的onChange代码:对于第一个答案:如果查询结果中有超过1条消息,那么它是不正确的。每当拦截失败消息时,我只读取查询的第一个结果,因为对于每个新的失败消息事件,都会生成一个对onChange的新调用,因此无需读取多个条目。好的,第二个答案。对于最后一个,我已经知道我可以在onChange方法中获得SMS id,事实上我是这样做的。我不知道如何删除手机短信content://sms/failed 尽管如此。1)你不应该得到超过