我正在尝试拨打电话时打开一个意图。但应用程序崩溃了。 我错过了什么或者这不能做到吗? 或者有没有办法在呼叫创建事件和接收者接收呼叫事件之间打开不同的屏幕(活动/片段)?
答案 0 :(得分:2)
收听拨出电话请求
提供电话呼叫服务的应用程序(例如VOIP或号码 管理)可以设置Intent过滤器来处理拨出呼叫 请求,例如Dialer或其他已安装的应用程序。 这为可以转换的用户提供了无缝集成 直接到呼叫服务,无需重拨或启动 另一个应用程序。
当用户发起呼叫时,系统会通过感兴趣的应用程序通知 发送
NEW_OUTGOING_CALL
意图的有序广播, 附加原始电话号码,URI和其他信息 临时演员。这为Google Voice等应用提供了机会 在将呼叫传递给系统之前修改,重新路由或取消呼叫 默认手机应用。如果您希望手机通话应用能够处理拨出电话 请求,实现接收的广播接收器
NEW_OUTGOING_CALL
意图,处理号码,并发起呼叫 如所须。确保为NEW_OUTGOING_CALL
声明一个意图过滤器 在接收器中,让系统知道您的应用程序感兴趣 广播。您还需要申请PROCESS_OUTGOING_CALLS
获得意图的许可。请注意,系统仅为数字广播
NEW_OUTGOING_CALL
与核心拨号功能无关的功能 紧急电话号码。这意味着NEW_OUTGOING_CALL
不能干涉 使用CALL_PRIVILEGED
的方式访问紧急服务 威力。这是在app的清单中声明的示例广播接收器 文件:
<manifest> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <application> ... <receiver android:name=MyOutgoingCallHandler"> <intent-filter> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> ... </application> </manifest>
相应的广播接收器的实现看起来 像这样的东西:
public class MyOutgoingCallHandler extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Extract phone number reformatted by previous receivers String phoneNumber = getResultData(); if (phoneNumber == null) { // No reformatted number, use the original phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); } // My app will bring up the call, so cancel the broadcast setResultData(null); // Start my app to bring up the call ... } }
由于订购了
NEW_OUTGOING_CALL
广播,您的应用可以 选择是自己使用呼叫请求还是简单地处理 数字并将结果数据传递给其他可能的应用程序 感兴趣。在该示例中,广播接收器打开电话 调用它自己的服务并将结果数据设置为null。这个 阻止呼叫请求到达默认电话应用程序。