导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 8 的 VoIP 应用

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

借助 Windows Phone 8,您可以创建实现 IP 语音 (VoIP) 的应用,以提供用户在手机网络连接上进行视频或音频呼叫的功能。用户安装 VoIP 应用时,与其他应用一样,该应用将显示在用户的“应用列表”中。但是,当 VoIP 应用收到来电时,将显示内置的手机体验,并且 VoIP 应用看起来像是已集成到手机。

说明注意:

要使用 VoIP,您必须在应用清单中设置 ID_CAP_VOIP 功能。如果您没有设置此功能,您的应用可能无法正常工作。有关更多信息,请参见 Windows Phone 8 应用功能和硬件要求

正如所有 Windows Phone 应用一样,请确保在开始新项目之前,检查适用的认证要求。有关 VoIP 应用的要求,请参见 Windows Phone 特定应用类型的其他要求

本主题包括以下部分。

Windows Phone VoIP 应用由在两个进程的某一进程内运行的多个组件和一个在任意进程外运行的组件组成。第一个进程是显示应用 UI 的前台进程。第二个进程是后台进程,该进程执行大部分的创建、连接和管理来电和拨出电话的工作。下图显示了 VoIP 应用的组件。

VoIP app architecture

下表提供每个 VoIP 应用组件的简要说明。

  • 前台应用

    为应用提供 UI 的组件。与任何其他 Windows Phone 应用一样,它显示在手机“应用列表”中,并且您可以将它作为应用磁贴固定到“开始”屏幕。与其他应用一样,该组件也在前台进程中运行。除了提供 UI 之外,前台应用还设置了来电进入的推送通知通道。它还启动后台进程,并使用进程外服务器将命令传递到后台的组件中,例如,要求结束呼叫。

  • 进程外服务器

    前台应用和后台组件用于在进程之间通信的服务器。

  • 后台代理

    VoIP 应用使用的四个后台代理。这些代理是使用托管代码编写的,并且将启动以指示新的阶段的 VoIP 呼叫已经开始。通常,这些代理只有非常少的代码,并且仅将呼叫的状态传递到执行大部分工作的以下任一组件。

    • VoipHttpIncomingCallTask.在推送通知通道收到新的来电时启动。它使 Windows Phone 运行时 程序集了解到它应该创建新的呼叫。

    • VoipForegroundLifetimeAgent.由前台应用启动,并且只要应用位于前台中,它将持续运行。它将引导后台进程并将其进程保持为活动状态,以便能够快速地创建拨出电话。

    • VoipCallInProgressAgent.在呼叫变为活动状态时启动。它指示应用,已分配更多的 CPU 周期,因此应用可以编码和解码音频和视频。

    • VoipKeepAliveTask.将定期运行,默认为每 6 个小时(不论前台应用是否在运行)。这使应用能够对 VoIP 服务执行 ping 操作,以指示应用仍安装在该设备上。用户卸载应用后,此代理不会再运行,并且此服务知道,不得再向应用的推送通知通道发送来电。

  • Windows Phone 运行时程序集

    使用 VoipCallCoordinatorVoipPhoneCall 对象执行大部分连接和管理 VoIP 呼叫工作的程序集。由于这是一个 Windows Phone 运行时 程序集而不是托管的程序集,因此它可以调用本机 API 以用于音频和视频处理。

  • 本机核心程序集

    许多 VoIP 应用开发程序支持多个平台,且通常具有一个使用 C 或 C++ 编写的核心库。此库可以用于 Windows Phone VoIP 应用以支持代码重用和加快应用开发。

  • VoIP 云服务

    以远程方式运行的 VoIP 服务。

  1. 用户首次启动您的 VoIP 应用时,您应创建一个推送通知通道。有关设置推送通知通道的详细信息,请参见 Windows Phone 8 的推送通知

  2. 为启动新的来电,VoIP 云服务将推送通知发送到应用的推送通知通道的 URI。

  3. 操作系统将启动您应用的 VoipHttpIncomingCallTask 代理。

    在来电代理运行时:

    1. 来电代理将加载应用的 Windows Phone 运行时 程序集(如果尚未加载)。

    2. 来电代理将从 MessageBody 属性获取推送通知负载,然后通过调用名称类似于 OnIncomingCallReceived 的自定义方法,将其传入 Windows Phone 运行时 程序集。

    3. OnIncomingCallReceived 中,您的 Windows Phone 运行时 程序集 VoipCallCoordinator.RequestNewIncomingCall 将传入来自推送通知负载的信息,例如,呼叫方的名称和呼叫方的联系人图片的 URI。此信息允许手机向用户显示内置的手机 UI。

    4. VoipCallCoordinator.RequestNewIncomingCall 方法将返回表示请求的呼叫的 VoipPhoneCall 对象。您的 Windows Phone 运行时 程序集应该存储此对象,以便能够从其他方法中使用它,然后为该呼叫对象的 AnswerRequestedRejectRequested 事件注册处理程序。

    5. AnswerRequested 事件处理程序中,可以联系您的云服务以告知它新的呼叫已经开始,例如,指示该呼叫的计费应该开始。然后,您应该调用 NotifyCallActive 以通知系统该呼叫现在处于活动状态。

    6. 如果 RejectRequested 事件处理程序被调用,您知道该呼叫已经被拒,并且您有 10 秒钟的时间清除任意资源,然后操作系统将终止您的进程,并假定其他 VoIP 后台代理的某个代理已停止运行。

  4. 调用 NotifyCallActive 后,操作系统将启动您的 VoipCallInProgressAgent。此代理运行时,您知道您的后台进程获得了更多的 CPU 分配来进行音频编码和解码。在 VoipCallInProgressAgent 运行时,执行以下操作:

    1. 加载您的 Windows Phone 运行时 程序集(如果尚未加载)。

    2. 在 Windows Phone 运行时 程序集中,为 MuteRequestedUnmuteRequestedAudioEndpointChanged 事件注册处理程序(如果您尚未执行此操作)。

    3. 在来电代理正在运行时,为您存储的 VoipPhoneCall 对象的 EndRequestedHoldRequestedResumeRequested 事件注册事件处理程序。如果您希望的话,首次创建对象时,可以为所有的 VoipPhoneCall 事件进行注册。

    4. 将传入视频流挂钩到您前台应用中的 MediaElement。有关设置视频流的详细演练,请参见如何为 Windows Phone 8 的 VoIP 通话实现视频流传输

    5. 当您的 Windows Phone 运行时 程序集收到要在呼叫状态中进行更改的事件(例如 HoldRequestedResumeRequested),请采取合理的措施,如挂起或继续视频的流处理。

    6. 当用户在您的 UI 中按下按钮以结束呼叫时,前台应用将调用 Windows Phone 运行时 程序集中的方法以结束呼叫,这会将呼叫对象设置为 null,然后调用 NotifyCallEnded。您也应在 EndRequested 中执行此操作,它会在操作系统结束呼叫时引发:例如用户从不同的 VoIP 应用回答 VoIP 呼叫时,或用户已经在回答手机呼叫和 VoIP 呼叫时又回答了第二个手机呼叫的时候。

  1. 当您的前台应用启动时:

    1. 调用 Launch() 以启动您的后台进程。这将导致操作系统为应用生成后台进程,并调用 VoipForegroundLifetimeAgent 代理的 OnLaunched() 方法。只要您的应用在前台运行,前台生存期代理将持续保持为活动状态。

    2. VoipForegroundLifetimeAgent 中,加载您的 Windows Phone 运行时 程序集(如果尚未加载)。

    3. 使用自定义的事件以使前台应用了解到后台进程已经准备就绪,并且已加载了所有的程序集。然后,在前台应用中创建对您的 Windows Phone 运行时 程序集的引用。

  2. 在用户选择要呼叫的联系人,然后按下应用中的“呼叫”按钮后:

    1. 调用 Windows Phone 运行时 程序集上的自定义方法,其名称类似于 MakeOutgoingCall

    2. MakeOutgoingCall 中,调用 RequestNewOutgoingCall 方法,然后传递正在呼叫的人员的姓名(以便它可以显示在最小化的手机 UI 中)并传递呼叫将使用音频还是音频和视频。

  3. RequestNewOutgoingCall 方法将返回表示请求的呼叫的 VoipPhoneCall 对象。您的 Windows Phone 运行时 程序集应该存储此对象,以便能够从其他方法中使用它,然后为该呼叫对象的 AnswerRequestedRejectRequested 事件注册处理程序。

  4. 您应该调用 NotifyCallActive 以通知系统此呼叫现在处于活动状态。

  5. 操作系统将启动 VoipCallInProgressAgent。此代理运行时,您知道您的后台进程获得了更多的 CPU 分配来进行音频编码和解码。在 VoipCallInProgressAgent 正在运行时:

    1. 加载您的 Windows Phone 运行时 程序集(如果尚未加载)。

    2. 在 Windows Phone 运行时 程序集中,为 MuteRequestedUnmuteRequestedAudioEndpointChanged 事件注册处理程序(如果您尚未执行此操作)。

    3. 在来电代理正在运行时,为您存储的 VoipPhoneCall 对象的 EndRequestedHoldRequestedResumeRequested 事件注册事件处理程序。如果您希望的话,首次创建对象时,可以为所有的 VoipPhoneCall 事件进行注册。

    4. 将传入视频流挂钩到您前台应用中的 MediaElement。有关设置视频流的详细演练,请参见如何为 Windows Phone 8 的 VoIP 通话实现视频流传输

    5. 当用户在您的 UI 中按下按钮以结束呼叫,前台应用将调用 Windows Phone 运行时 程序集中的方法以结束该呼叫,该方法会将呼叫对象设置为 null,然后调用 NotifyCallEnded。您也应在 EndRequested 中执行此操作,它会在操作系统结束呼叫时引发:例如用户从不同的 VoIP 应用回答 VoIP 呼叫时,或用户已经在回答手机呼叫和 VoIP 呼叫时又回答了第二个手机呼叫的时候。

要查看 VoIP 示例应用(展示 VoIP API 的使用并允许您使用环回音频和视频来模拟传入和传出的 VoIP 呼叫),请参见 ChatterBox VoIP 示例应用

显示:
© 2014 Microsoft