更新时间:2019-11-20
描述
会议中,移动与会者主动共享屏幕,观看屏幕或程序共享。
前提条件
业务流程
在调用开始屏幕共享startScreenShare()方法之前,UI侧需要先调用MediaProjectionManager.createScreenCaptureIntent()方法向系统申请截屏权限。
在申请截屏权限成功的回调onActivityResult中再调用startScreenShare()方法开始共享屏幕。
代码示例:
//Java code public int startScreenShare(Context context, Intent data){ if (null == currentConference) { Log.e(TAG, "start screen share failed, currentConference is null "); return -1; } int result = currentConference.startScreenShare(context,data); return result; } |
代码示例:
//Java code public void onEvtAsStateChange(TsdkConference conference, TsdkConfAppShareType shareType,TsdkConfAsStateInfo asStateInfo) { Log.i(TAG, "handleAsStateChange"); switch (TsdkConfShareState.enumOf(asStateInfo.getState())) { // 开始共享 case TSDK_E_CONF_AS_STATE_VIEW: isShareAs = true; mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.START_DATA_CONF_SHARE, asStateInfo); break; // 结束共享 case TSDK_E_CONF_AS_STATE_NULL: isShareAs = false; if ((0 == documentId.size() || null == documentId)) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_DATA_CONF_SHARE, asStateInfo); } break; default: break; } } |
代码示例:
//Java code public void OnEvtAsOwnerChange(TsdkConference conference,TsdkConfAsActionType actionType, TsdkAttendee owner){ Log.i(TAG, "handleAsOwnerChange"); if (owner==null||self==null){ return; } switch (actionType){ case TSDK_E_CONF_AS_ACTION_ADD: if (owner.getBaseInfo().getNumber().equals(self.getNumber())){ mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); }else { stopScreenShare(); mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, TsdkConfAsActionType.TSDK_E_CONF_AS_ACTION_MODIFY); } break; case TSDK_E_CONF_AS_ACTION_DELETE: mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); break; } } |
代码示例:
//Java code public void stopScreenShare(){ if (null == currentConference) { Log.e(TAG, "stop screen share failed, currentConference is null "); return ; } currentConference.stopScreenShare(); } |
代码示例:
//Java code public void onEvtAsStateChange(TsdkConference conference, TsdkConfAppShareType shareType,TsdkConfAsStateInfo asStateInfo) { Log.i(TAG, "handleAsStateChange"); switch (TsdkConfShareState.enumOf(asStateInfo.getState())) { // 开始共享 case TSDK_E_CONF_AS_STATE_VIEW: isShareAs = true; mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.START_DATA_CONF_SHARE, asStateInfo); break; // 结束共享 case TSDK_E_CONF_AS_STATE_NULL: isShareAs = false; if ((0 == documentId.size() || null == documentId)) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_DATA_CONF_SHARE, asStateInfo); } break; default: break; } } |
代码示例:
//Java code public void OnEvtAsOwnerChange(TsdkConference conference,TsdkConfAsActionType actionType, TsdkAttendee owner){ Log.i(TAG, "handleAsOwnerChange"); if (owner==null||self==null){ return; } switch (actionType){ case TSDK_E_CONF_AS_ACTION_ADD: if (owner.getBaseInfo().getNumber().equals(self.getNumber())){ mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); }else { stopScreenShare(); mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, TsdkConfAsActionType.TSDK_E_CONF_AS_ACTION_MODIFY); } break; case TSDK_E_CONF_AS_ACTION_DELETE: mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); break; } } |
UI调用TsdkConference对象中的attachSurfaceView()方法绑定视图,刷新共享显示区域。
//Java code public void attachSurfaceView(ViewGroup container, Context context) { if (null == currentConference) { Log.e(TAG, "attach surface view failed, currentConference is null "); return; } currentConference.attachSurfaceView(container, context); } |
共享状态可参考枚举类TsdkConfShareState,其中TsdkConfShareState.TSDK_E_CONF_AS_STATE_NULL为结束程序或者屏幕共享状态。
//Java code public void handleAsStateChange(TsdkConfAsStateInfo asStateInfo) { switch (asStateInfo.getState()) { case 0: mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_AS_SHARE, asStateInfo); break; default: break; } } |
attendee 为被邀者号码。
actionType 为共享行为类型。TSDK_E_CONF_AS_ACTION_ADD 为邀请共享,TSDK_E_CONF_AS_ACTION_DELETE 为取消共享。
代码示例:
//Java code public int setAsOwner(String attendee, TsdkConfAsActionType actionType){ if (null == currentConference) { Log.e(TAG, "clear annotation failed, currentConference is null "); return -1; } return currentConference.setAsOwner(attendee, actionType); } |
代码示例:
//Java code public void OnEvtAsOwnerChange(TsdkConference conference,TsdkConfAsActionType actionType, TsdkAttendee owner){ Log.i(TAG, "handleAsOwnerChange"); if (owner==null||getCurrentConferenceSelf()==null){ return; } switch (actionType){ case TSDK_E_CONF_AS_ACTION_ADD: if (owner.getBaseInfo().getNumber().equals(getCurrentConferenceSelf().getNumber())){ mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); }else { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, TsdkConfAsActionType.TSDK_E_CONF_AS_ACTION_MODIFY); } break; case TSDK_E_CONF_AS_ACTION_DELETE: case TSDK_E_CONF_AS_ACTION_REQUEST: mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); break; } } |
同意可以调用startScreenShare方法开始共享,拒绝可以调用setAsOwner方法取消共享。
在调用开始屏幕共享startScreenShare()方法之前,UI侧需要先调用MediaProjectionManager.createScreenCaptureIntent()方法向系统申请截屏权限。
在申请截屏权限成功的回调onActivityResult中再调用startScreenShare()方法开始共享屏幕。
代码示例:
//Java code public int startScreenShare(Context context, Intent data){ if (null == currentConference) { Log.e(TAG, "start screen share failed, currentConference is null "); return -1; } int result = currentConference.startScreenShare(context,data); return result; } |
代码示例:
//Java code public void onEvtAsStateChange(TsdkConference conference, TsdkConfAppShareType shareType,TsdkConfAsStateInfo asStateInfo) { Log.i(TAG, "handleAsStateChange"); switch (TsdkConfShareState.enumOf(asStateInfo.getState())) { // 开始共享 case TSDK_E_CONF_AS_STATE_VIEW: isShareAs = true; mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.START_DATA_CONF_SHARE, asStateInfo); break; // 结束共享 case TSDK_E_CONF_AS_STATE_NULL: isShareAs = false; if ((0 == documentId.size() || null == documentId)) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_DATA_CONF_SHARE, asStateInfo); } break; default: break; } } |
代码示例:
//Java code public void OnEvtAsOwnerChange(TsdkConference conference,TsdkConfAsActionType actionType, TsdkAttendee owner){ Log.i(TAG, "handleAsOwnerChange"); if (owner==null||getCurrentConferenceSelf()==null){ return; } switch (actionType){ case TSDK_E_CONF_AS_ACTION_ADD: if (owner.getBaseInfo().getNumber().equals(getCurrentConferenceSelf().getNumber())){ mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); }else { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, TsdkConfAsActionType.TSDK_E_CONF_AS_ACTION_MODIFY); } break; case TSDK_E_CONF_AS_ACTION_DELETE: case TSDK_E_CONF_AS_ACTION_REQUEST: mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); break; } } |
//Java code public int setAsOwner(String attendee, TsdkConfAsActionType actionType){ if (null == currentConference) { Log.e(TAG, "clear annotation failed, currentConference is null "); return -1; } return currentConference.setAsOwner(attendee, actionType); } |
代码示例:
//Java code public void OnEvtAsOwnerChange(TsdkConference conference,TsdkConfAsActionType actionType, TsdkAttendee owner){ Log.i(TAG, "handleAsOwnerChange"); if (owner==null||self==null){ return; } switch (actionType){ case TSDK_E_CONF_AS_ACTION_ADD: if (owner.getBaseInfo().getNumber().equals(self.getNumber())){ mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); }else { stopScreenShare(); mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, TsdkConfAsActionType.TSDK_E_CONF_AS_ACTION_MODIFY); } break; case TSDK_E_CONF_AS_ACTION_DELETE: mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.SCREEN_SHARE_STATE, actionType); break; } |
注意事项
无。
描述
会议中,移动与会者观看文档或白板共享。
移动应用程序暂不具备共享文档和白板的能力,文档或白板的共享者为PC应用程序。
前提条件
业务流程
//Java code public void attachSurfaceView(ViewGroup container, Context context) { if (null == currentConference) { Log.e(TAG, "attach surface view failed, currentConference is null "); return; } currentConference.attachSurfaceView(container, context); } |
如果共享侧新建一个空的白板文档,移动侧SDK下载到一个白板文档头后,通过TsdkNotify对象中onEvtWbDocNew()方法向UI上报新建一个白板文档事件。
Java code public void handleWbDocNew(TsdkDocBaseInfo docBaseInfo) { if (null == docBaseInfo) { return; } documentId.add(docBaseInfo.getDocumentId()); mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.START_DATA_CONF_SHARE, docBaseInfo); } |
Java code public void handleDsDocNew(TsdkDocBaseInfo docBaseInfo) { if (null == docBaseInfo) { return; } documentId.add(docBaseInfo.getDocumentId()); mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.START_DATA_CONF_SHARE, docBaseInfo); } |
PC端用户在进行文档或者白板共享中结束共享文档或白板。
如果移动侧SDK通过TsdkNotify对象中的onEvtDsDocDel()方法向UI上报文档被删除通知消息,UI关闭文档共享显示窗口。
如果移动侧SDK通过TsdkNotify对象中的onEvtWbDocDel()方法向UI上报白板被删除通知消息,UI关闭白板共享显示窗口。
代码示例:
//Java code public void handleDsDocDel(TsdkDocShareDelDocInfo docShareDelDocInfo) { if (null == docShareDelDocInfo) { return; } Iterator<Integer> iterator = documentId.iterator(); while (iterator.hasNext()) { if (iterator.next() == docShareDelDocInfo.getDocBaseInfo().getDocumentId()) { iterator.remove(); } } if (0 == documentId.size() && !isShareAs) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_DATA_CONF_SHARE, docShareDelDocInfo); } } |
//Java code public void handleWbDocDel(TsdkWbDelDocInfo wbDelDocInfo) { if (null == wbDelDocInfo) { return; } Iterator<Integer> iterator = documentId.iterator(); while (iterator.hasNext()) { if (iterator.next() == wbDelDocInfo.getWbBaseInfo().getDocumentId()) { iterator.remove(); } } if (0 == documentId.size() && !isShareAs) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_DATA_CONF_SHARE, wbDelDocInfo); } } |
注意事项
无。
描述
在屏幕共享中,与会者间可以通过标注功能在共享界面进行远程交流。
前提条件
正在进行屏幕共享。
代码示例:
//Java code public int startAnnotation( ){ if (null == currentConference) { Log.e(TAG, "start annotation failed, currentConference is null "); return -1; } int result = currentConference.startAnnotation(); return result; } |
代码示例:
//Java code public void onEvtAsStateChange(TsdkConference conference, TsdkConfAppShareType shareType,TsdkConfAsStateInfo asStateInfo) { Log.i(TAG, "handleAsStateChange"); switch (TsdkConfShareState.enumOf(asStateInfo.getState())) { // 开始共享 case TSDK_E_CONF_AS_STATE_VIEW: isShareAs = true; mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.START_DATA_CONF_SHARE, asStateInfo); break; // 结束共享 case TSDK_E_CONF_AS_STATE_NULL: isShareAs = false; if ((0 == documentId.size() || null == documentId)) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_DATA_CONF_SHARE, asStateInfo); } break; default: break; } } |
代码示例:
//Java code public void setAnnotationPen(int penColor, int penWidth) { if (null == currentConference) { Log.e(TAG, "set annotation pen failed, currentConference is null "); return; } currentConference.setAnnotationPen(penColor, penWidth); } |
代码示例:
//Java code public void setAnnotationLocalStatus(boolean enable) { if (null == currentConference) { Log.e(TAG, "set annotation local status failed, currentConference is null "); return; } currentConference.setAnnotationLocalStatus(enable); } |
代码示例:
//Java code public void setAnnotationLocalStatus(boolean enable) { if (null == currentConference) { Log.e(TAG, "set annotation local status failed, currentConference is null "); return; } currentConference.setAnnotationLocalStatus(enable); } |
代码示例:
//Java code public int stopAnnotation(){ if (null == currentConference) { Log.e(TAG, "stop annotation failed, currentConference is null "); return -1; } int result = currentConference.stopAnnotation(); return result; } |
代码示例:
//Java code public void onEvtAsStateChange(TsdkConference conference, TsdkConfAppShareType shareType,TsdkConfAsStateInfo asStateInfo) { Log.i(TAG, "handleAsStateChange"); switch (TsdkConfShareState.enumOf(asStateInfo.getState())) { // 开始共享 case TSDK_E_CONF_AS_STATE_VIEW: isShareAs = true; mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.START_DATA_CONF_SHARE, asStateInfo); break; // 结束共享 case TSDK_E_CONF_AS_STATE_NULL: isShareAs = false; if ((0 == documentId.size() || null == documentId)) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.END_DATA_CONF_SHARE, asStateInfo); } break; default: break; } } |
注意事项
无。
描述
会议中,所有人可以收到其他与会者发送的聊天消息内容。
前提条件
加入数据会议成功。
业务流程
//Java code public void sendConfMessage(String message) { if (null == currentConference) { Log.e(TAG, "send chat failed, currentConference is null "); return; } TsdkConfChatMsgInfo chatMsgInfo = new TsdkConfChatMsgInfo(); chatMsgInfo.setChatType(TsdkConfChatType.TSDK_E_CONF_CHAT_PUBLIC); chatMsgInfo.setChatMsg(message); chatMsgInfo.setSenderDisplayName(self.getDisplayName()); currentConference.sendChatMsg(chatMsgInfo); } |
//Java code public void handleRecvChatMsg(TsdkConfChatMsgInfo confChatMsgInfo) { mConfNotification.onConfEventNotify(ConfConstant.CONF_EVENT.CONF_CHAT_MSG, confChatMsgInfo); } |
注意事项
无。