【发布时间】:2011-06-19 19:26:57
【问题描述】:
我正在尝试拦截拨出电话,并通过对话框为用户提供中止或继续通话的选项。
第一步显然是编写一个注册NEW_OUTGOING_CALL的BroadcastReceiver,我已经成功完成了。
我还创建了一个基于 Dialog 主题的 Activity,它向用户展示了 Abort/Continue 按钮。当拨出电话时,我当前的代码从广播接收器启动它没有问题。
我一直在努力保持呼叫操作,直到用户有机会做出响应。虽然您可以从 BroadcastReceiver 的 onReceive 方法调用 startActivity,但该调用会立即返回,在我的情况下,这意味着在显示对话框时调用会进行。
Android "Receiver Lifecycle" information 对此有相当严格的看法,他说:
特别是,您不得显示对话框或从 广播接收器。对于前者,您应该改用 NotificationManager API。 对于后者,您可以使用 Context.startService() 向服务发送命令。
我了解阻塞以及在广播接收器中显示 UI 元素的一般不良情况。我也知道 Android 通常是异步的,因此这有点奇怪。但是,在这种情况下,我觉得它是合适的。通知绝对不会解决我的问题。因此,我希望 StackOverflow 的聪明人能够找到一种方法,尽管 Google 说它做不到。
此外,Google Voice 似乎也能做到这一点。
不管怎样,我已经搜索了 StackOverflow 和网络的其余部分来寻找答案。虽然有大量相关问题,但除了this one 之外,我还没有找到一个完全符合我的问题本质的问题,这是一个完全正确的问题,但唯一的答案完全没有抓住重点。
我考虑过的一个选项是中止原始呼叫,然后在用户选择“继续”时进行新呼叫。我想我必须以某种方式通知我的广播接收器不要显示这种情况下的对话框。这应该是可行的,但感觉过于复杂。
提前感谢您的帮助。
【问题讨论】:
-
一般来说,如果你想玩弄系统,你的代码会变得复杂。我实际上没有看到其他解决方案,而是您描述的那个。
-
更多信息。在 API 级别 11 (3.0) 中,他们似乎通过引入 BroadcastReceiver.PendingResult 类和 goAsync 调用解决了这个问题。有了这个,路径就很明显了。不幸的是,我正在尝试为 11 之前的设备执行此操作。
标签: android