范围
通过RFC4575协议解读一文我们了解会议状态信息是通过NOTIFY消息通知到手机终端,通常是以xml的格式,芯片厂商在提供源码时就已实现了该部分功能,本文主要结合Android AOSP平台介绍下会议通话的event上报流程。
内容
因为芯片厂商已经实现了会议电话的状态消息内容解析功能,这部分代码通常包含在私有APK中,这里主要介绍芯片厂商的apk是如何通过Android的公用接口上报该部分信息的。
芯片厂商APK如何上报会议信息
芯片厂商都是在自己的私有apk中实现解析功能,解析完成后通过Android的公共接口上报,在android平台我们关注以下几个类:
- ImsConferenceState.java
- ImsCallSessionListener.java
- ImsCallSession.java
- ImsCall.java
芯片厂商的私有apk在解析完会议even内容后封装成ImsConferenceState对象,这里先看下ImsConferenceState.java如何定义的。
public final class ImsConferenceState implements Parcelable {
/**
* conference-info : user
*/
// user (String) : Tel or SIP URI
public static final String USER = "user";
// user > display text (String)
public static final String DISPLAY_TEXT = "display-text";
// user > endpoint (String) : URI or GRUU or Phone number
public static final String DISPLAY_TEXT= "endpoint";
// user > endpoint > status
public static final String STATUS = "status";
ImsConferenceState中共定义了4个我们需要关注的内容,分别是USER、DISPLAY_TEXT、DISPLAY_TEXT和STATUS,其对应USER节点以及其下的几个子节点内容,从这里看到,其实android原生平台是不支持获取会议成员的·media状态的。
ImsConferenceState对象构建完成后会通知监听对象当前会议状态有更新,可以参考callSessionConferenceStateUpdated方法。最终在ImsCall的notifyConferenceStateUpdated方法中我们可以看到如下内容:
private void notifyConferenceStateUpdated(ImsConferenceState state) {
if (state == null || state.mParticipants == null) {
return;
}
Set<Entry<String, Bundle