【问题标题】:Android failed sms observerAndroid失败的短信观察者
【发布时间】:2016-01-10 15:25:09
【问题描述】:

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

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

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

【问题讨论】:

  • 天哪!我的眼睛!!! TL;DR 请提高可读性。

标签: java android sms contentobserver


【解决方案1】:

...有没有办法区分删除和添加事件与内容观察者?

查询传入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;

    ...
}

很高兴了解为什么 content://sms/failed 上的 ContentObserver 不起作用。

这就是 SMS ContentProvider 的实现方式。没有比content://sms 更具体的了。

我还有一个小问题...

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

【讨论】:

  • 对于第一个答案:如果查询结果中有超过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 删除重新发送的消息,真正的问题是当删除发生时(我的意思是无论删除,例如用户在短信应用程序中手动执行的删除),触发 onChange 方法无法了解该呼叫是删除还是新的失败短信传出。无论如何,这是我的 onChange 的代码:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多