【问题标题】:Wait for user input before placing outgoing call在拨出电话之前等待用户输入
【发布时间】: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


【解决方案1】:

我想如果用户需要,您可以使用呼叫意图过滤器来调用您的活动。这将创建一个询问对话框,直到用户提供输入为止。如我错了请纠正我。

【讨论】:

  • 我不确定我是否完全理解您的回复。我已经在使用 NEW_OUTGOING_CALL 意图来调用用户拨打电话的代码。那不是问题。问题是在用户拨打电话后,我必须决定如何处理 onReceive 方法中的拨出电话,这只会让我有时间启动一个对话框,而不是等待用户输入.
  • hmm 我想这可能是问题的原因.. 请参阅广播接收器充当特定事件的注册通知者。现在您和默认电话应用程序已注册接收 New_OUTGOING_CALL 操作。因此,可以在获取特定事件时调用您的应用程序,但是如果您的应用程序在某个地方停止弹出应用程序,则另一个应用程序(默认电话应用程序)会进行调用,因为电话应用程序也会收到通知,因为我们只是将其留下 sdk 来调用应用程序.现在 sdk 通知所有注册的应用程序。
  • 有点。不过,这是一个“有序”广播,这意味着它由注册的接收者一次处理一个。 “默认电话”应用程序只有在我完成后才能处理它。我可以永远坐在 onReceive 中,电话永远不会出去。我只是想不出在等待用户输入时坐在 onReceive 中的方法,这是需要发生的。再次,查看 BroadcastReceiver.goAsync 以了解在 API 级别 11 中解决此确切问题的新方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多