- 文档首页
实时音视频
实时音视频
开发指南
屏幕共享
Android 端屏幕共享
Android 端屏幕共享
在实时通信中,如果你希望用户可以分享本端设备的屏幕和设备播放的音频,可以使用 RTC 内建的屏幕采集功能,也可以自行实现屏幕采集逻辑(自定义采集),并通过屏幕共享功能,与远端用户共享。
在使用屏幕共享功能时,仅可见的用户可以发布屏幕流。
适用场景
你可以在多种行业、多种场景下使用屏幕共享功能:
功能实现
Android 端屏幕共享基于 Android 5 (API 级别 21) 中引入的媒体投影 API 和 RTC 提供的 API 共同实现。
前提条件
- Android 5.0 (API 级别 21) 及以上版本。推荐使用 Android 10 (API 级别 29) 及以上版本。
说明
- 在使用屏幕共享功能期间,如果您切换到带有 DRM 版权保护(如爱奇艺、Netflix 等流媒体播放器)或应用层主动设置了禁止录屏截屏标志(如部分银行 App 的密码输入界面)的应用,RTC 的屏幕共享模块将无法获取到这些应用的画面内容,接收端可能会看到纯黑屏。
- Android 5.0 ~ 10 版本仅支持屏幕视频采集,不支持屏幕音频采集。
接入流程
工程配置
Android 10 (API 级别 29) 及以上进行屏幕采集需要用到前台服务,在应用的 Android 清单文件中添加如下前台服务声明。
录音权限声明已包含在 RTC SDK 中,App 清单文件无需添加。
Android 14(API 级别 34)及以上还需声明如下权限,以免出现应用闪退等异常:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
权限申请
向系统请求屏幕共享的权限。
在权限申请的响应中,开启屏幕共享。
API 调用
- 远端使用 onUserPublishStreamVideo 和 onFirstRemoteVideoFrameDecoded 回调监视视频流和屏幕共享流。建议您在 onFirstRemoteVideoFrameDecoded 回调中设置视频渲染,确保视频渲染在视频解码完成后进行,以避免卡顿。
自定义采集屏幕视频流
RTC 强烈建议你使用内部采集。如果你仍然希望使用自定义采集,参看以下步骤。
常见问题
- 当前的系统版本低于 Android 10,系统不支持屏幕音频采集。
- 其他 App 独占了屏幕音频捕获。切换至其他 App,查看是否开启了独占设置。
- Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
- 在 AndroidManifest.xml 中配置 android.permission.FOREGROUND_SERVICE 权限和 com.ss.bytertc.base.media.screen.RXScreenCaptureService 声明。
- 检查启动 RXScreenCaptureService 时,RXScreenCaptureService.KEY_LAUNCH_ACTIVITY 是否传入了全类名。 由于启动流程中开启 notification 时,需要获取全类名,以通过反射获取相关联的 activity,非全类名将导致 notification 创建失败,并收到上述错误提示。
- 检查启动 RXScreenCaptureService 时,RXScreenCaptureService.KEY_RESULT_DATA 是否传入 。
- 使用 Android 5.0 ~ 10 版本 设备进行屏幕共享后自动断开。
- 上述系统版本的个别 Android 机型可能存在兼容性问题。建议用户升级系统版本。
功能变更日志
本文最近更新时的 SDK 版本为 3.50.1。如果你使用的 SDK 为之前版本,请查看以下变动,并进行相应适配。
- createRTCVideo 接口已变更为 createRTCEngine。
- publishScreen 和 unpublishScreen 接口已不存在。请使用 publishStreamVideo 和 publishStreamAudio 控制是否发布音视频。如果您已经调用 startScreenCapture,那么设置 publishStreamVideo(true) 将会直接开始发布屏幕流。
- 在屏幕准备好后,您会收到 onVideoDeviceStateChanged 回调。
- onUserUnPublishScreen 回调已不存在。请使用 onUserPublishStreamVideo 回调替代。使用 streamInfo.isScreen 来判断是否为屏幕流。
- 设置共享流的编码参数类型名称变更为 ScreenVideoEncoderConfig。
- publishScreen 和 unpublishScreen 的类名由 RTCEngine 变更为 RTCRoom。其他方法的类名由 RTCEngine 变更为 RTCVideo。
- 回调类名由 IRTCEngineEventHandler 变更为 IRTCVideoEventHandler。
- 设置共享流的编码参数方法由 setVideoEncoderConfig 变更为 setScreenVideoEncoderConfig。
- publishScreen 等 API 的参数有变更。
最近更新时间:2026.09.21 16:24:29