# 实现屏幕共享
# 简介
屏幕共享可以让您和频道中的其他成员一起分享设备里的精彩内容,您可以在频道中利用屏幕共享的功能进行文档演示、在线教育演示、视频会议以及游戏过程分享等。
# 适用场景
应用行业 | 场景说明 |
---|---|
在线教育 | 教学PPT等文档展示 |
视频会议 | 会议中文件共享 |
社交娱乐 | 游戏画面及过程分享 |
# 前提条件
集成服务器音视频录制功能前,请确保您已经集成了基础的多方音视频通话功能。
发起屏幕共享需要 Android 5.0 及以上。
WARNING
如果用户在 Android 10 或以上版本上共享屏幕,为避免 Android 系统触发 SecurityException( Android 原生回调),需要在 AndroidManifest.xml 文件中添加下面的声明否则高版本的 Android 终端将无法使用屏幕共享功能。
...
//获取前台服务的权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
...
//注册CaptureScreenService服务
<service android:name="com.justalk.cloud.zmf.CaptureScreenService"
android:enabled="true"
android:foregroundServiceType="mediaProjection"/>
另外SDK 不支持模拟器运行,请使用真机。
# 集成步骤
# 设置屏幕共享采集属性
您可以调用 JCMediaDevice 类中的 setScreenCaptureProperty (opens new window) 方法设置屏幕共享采集属性,包括采集的高度、宽度和帧速率。
/**
* 设置屏幕共享采集属性
* @param width 采集宽度,默认640
* @param height 采集高度,默认360
* @param frameRate 采集帧速率,默认10
*/
public abstract void setScreenCaptureProperty(int width, int height, int frameRate);
TIP
该方法可以在开启屏幕共享前调用,也可以在屏幕共享中调用;如果在屏幕共享中调用,则设置的采集属性要在下次屏幕共享开启时生效。
# 开启/关闭屏幕共享
开启或关闭屏幕共享需要根据当前的屏幕共享状态进行判断,具体通过 screenUserId (opens new window) 进行判断。当 screenUserId 不为空时说明当前存在屏幕共享,不能再发起屏幕共享,只有当 screenUserId 为空时才可以发起屏幕共享。
屏幕共享状态是否变化通过 screenShare (opens new window) 判断。如果屏幕共享状态发生了改变会触发 onMediaChannelPropertyChange (opens new window) 回调
/**
* 属性变化回调,目前主要关注屏幕共享状态的更新
*
* @param propChangeParam 变化标识集合
*/
void onMediaChannelPropertyChange(JCMediaChannel.PropChangeParam propChangeParam);
如果当前不存在屏幕共享或者自己发起了屏幕共享,可以调用下面的方法开启或关闭屏幕共享
/**
* 开关屏幕分享
* @param enable 是否开启屏幕分享
*
* @return 返回 true 表示正常执行调用流程,false 表示调用异常
*/
public abstract boolean enableScreenShare(boolean enable);
WARNING
屏幕共享发送方需要在 manifest 文件中做以下声明,否则无法发送本地视频桌面的视频流
<activity
android:name = "com.justalk.cloud.zmf.ZmfActivity"
android:theme = "@android:style/Theme.Dialog"/>
# 请求屏幕共享的视频流
如果频道中有成员开启了屏幕共享,其他成员将收到 onMediaChannelPropertyChange 的回调,您可以通过 screenUserId 属性获得发起屏幕共享的用户标识。
获得发起屏幕共享的用户标识后,可以调用 requestScreenVideo (opens new window) 方法请求屏幕共享的视频流
/**
* 请求屏幕共享的视频流
* 当 pictureSize 为 JCMediaChannelPictureSizeNone 表示关闭请求
*
* @param screenUri 屏幕分享uri
* @param pictureSize 视频请求尺寸类型
* @return 返回 true 表示正常执行调用流程,false 表示调用异常
* @see JCMediaChannel.PictureSize
*/
public abstract boolean requestScreenVideo(String screenUri, @PictureSize int pictureSize);
# 示例代码
// 开启或关闭屏幕共享
public void customEnableScreenShare(){
String selfUserId = mClient.getUserId();
String screenUserId = mMediaChannel.getScreenUserId();
if (TextUtils.equals(selfUserId, screenUserId)){
mMediaChannel.enableScreenShare(false);
}else{
mMediaChannel.enableScreenShare(true);
}
}
// 请求屏幕共享的视频流
@Override
public void onMediaChannelPropertyChange(JCMediaChannel.PropChangeParam propChangeParam) {
if (propChangeParam.screenShare && mMediaChannel.getScreenUserId() != null) {
// 请求视频流
mMediaChannel.startScreenShareVideo(RENDER_FULL_SCREEN, PICTURESIZE_SMALL);
mMediaChannel.requestScreenVideo(mMediaChannel.getScreenRenderId(),JCMediaChannel.PICTURESIZE_LARGE);
}
}