Android如何实现两台手机屏幕共享和远程控制?最新 SDK 接入教程

张开发
2026/4/28 6:17:53 15 分钟阅读

分享文章

Android如何实现两台手机屏幕共享和远程控制?最新 SDK 接入教程
笔者简介长期关注 RTC 实时音视频领域的技术演进参与过音视频算法工程化、接入实现与效果评估等相关工作。在实际项目中持续关注包括腾讯 TRTC、即构 ZEGO、 声网 Agora 在内的多家 RTC 厂商在实时通信能力与工程落地层面的实践重点关注 SDK 接入、通话链路实现与场景化应用。系列文章将围绕 RTC SDK 接入与实时互动能力实现持续输出工程实践与场景分析。本文重点关注 Android 端音视频能力实现、屏幕共享与远程控制等典型场景。主要基于最新版本的 ZEGO SDK 接入文档整理对部分接入流程和配置方式进行了更新。1 功能简介屏幕共享是指在视频通话或互动直播过程中将屏幕内容以视频的方式分享给其他的观众以增强互动体验提高沟通效率。屏幕共享在如下场景中应用广泛视频会议场景中屏幕共享可以将讲话者本地的文件、数据、网页、PPT 等画面分享给其他与会人在线课堂场景中屏幕共享可以将老师的课件、笔记、讲课内容等画面展示给学生观看。2 屏幕共享示例源码下载请参考 下载示例源码 获取源码。相关源码请查看 “/ZegoExpressExample/Others/src/main/java/im/zego/others/screensharing” 目录下的文件。others └── screensharing └── ScreenSharingActivity.java ...3 前提条件在实现屏幕共享功能之前请确保支持 Android 5.0 或以上版本且支持音视频的 Android 设备或模拟器推荐使用真机。已在 ZEGO 控制台 创建项目并申请有效的 AppID 和 AppSign详情请参考 控制台 - 项目信息。已在项目中集成 ZEGO Express SDK并实现了基本的音视频推拉流功能详情请参考 快速开始 - 集成 和 快速开始 - 实现流程。4 实现流程下图展示了 Android 平台实现屏幕共享的数据流转4.1必选获取用户录制屏幕授权在工程的 AndroidManifest.xml 文件中增加屏幕录制的权限配置。设置完成后在录制屏幕前会弹窗提示用户是否允许应用录制屏幕需要用户手动授权。屏幕录制功能依赖于前台服务保活进入您项目的 “app/src/main” 目录打开 “AndroidManifest.xml” 文件添加权限声明。如果目标 Android SDK 版本低于 34.0.0 版本需设置FOREGROUND_SERVICE权限声明。uses-permission android:nameandroid.permission.FOREGROUND_SERVICE/如果目标 Android SDK 版本是 34.0.0 及以后版本需要设置FOREGROUND_SERVICE及FOREGROUND_SERVICE_MEDIA_PROJECTION权限声明。uses-permission android:nameandroid.permission.FOREGROUND_SERVICE/ uses-permission android:nameandroid.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION/2. 声明屏幕录制的前台服务和辅助 Activity。注意如果您使用的是 3.6.0 或以上版本的 SDK且通过 Maven 自动集成或手动集成 “.aar” 包时可以跳过此步骤。如果您使用的是 3.6.0 以下版本的 SDK必须手动声明屏幕录制的前台服务和辅助 Activity否则无法启动屏幕录制。application activity android:nameim.zego.internal.screencapture.ZegoScreenCaptureManager$ZegoScreenCaptureAssistantActivity android:exportedfalse android:configChangesscreenSize|orientation android:screenOrientationbehind android:themeandroid:style/Theme.Translucent / service android:nameim.zego.internal.screencapture.ZegoScreenCaptureService android:enabledtrue android:exportedfalse android:foregroundServiceTypemediaProjection intent-filter action android:nameandroid.intent.action.screenshare / /intent-filter /service /application4.2 设置采集源为屏幕共享源SDK 推流的“视频源”默认为摄像头如果需要推屏幕共享源需要通过 setVideoSource 切换为屏幕共享。engine.setVideoSource(ZegoVideoSourceType.SCREEN_CAPTURE, ZegoPublishChannel.MAIN);SDK 推流的“音频源”默认为麦克风如果需要推屏幕共享源需要通过 setAudioSource 切换为屏幕共享。engine.setAudioSource(ZegoAudioSourceType.SCREEN_CAPTURE, ZegoPublishChannel.MAIN);4.3 开启屏幕共享调用 startScreenCapture 接口共享整个系统的画面、采集第三方应用的音频。engine.startScreenCapture();开发者还可以使用 ZegoScreenCaptureConfig 参数设置是否采集视频、是否采集音频、设置音频采集时的采样率和采样通道等。ZegoScreenCaptureConfig config new ZegoScreenCaptureConfig(); config.captureVideo true; config.captureAudio true; config.audioParam.sampleRate ZegoAudioSampleRate.ZEGO_AUDIO_SAMPLE_RATE_16K; config.audioParam.channel ZegoAudioChannel.STEREO; // 可选参数设置视频的采集区域必须在原始的视频数据之内单位为像素px config.cropRect new Rect(left, top, right, bottom); engine.startScreenCapture(config);4.3.1 设置屏幕共享朝向屏幕共享朝向支持跟随系统朝向和固定朝向默认跟随系统朝向。可以设置 ZegoScreenCaptureConfig 中的orientation参数来设置屏幕共享朝向。枚举值说明ZegoScreenCaptureOrientation.AUTO跟随系统朝向拉流端根据系统朝向展示画面ZegoScreenCaptureOrientation.LANDSCAPE固定横屏拉流端始终横屏画面ZegoScreenCaptureOrientation.PORTRAIT固定竖屏拉流端始终竖屏画面ZegoScreenCaptureConfig config new ZegoScreenCaptureConfig(); ... config.orientation ZegoScreenCaptureOrientation.LANDSCAPE; // 固定横屏 engine.startScreenCapture(config);4.4 更新屏幕共享配置调用 updateScreenCaptureConfig 接口可以更新屏幕共享的配置。ZegoScreenCaptureConfig config new ZegoScreenCaptureConfig(); config.captureVideo true; config.captureAudio false; config.audioParam.sampleRate ZegoAudioSampleRate.ZEGO_AUDIO_SAMPLE_RATE_32K; config.audioParam.channel ZegoAudioChannel.STEREO; config.orientation ZegoScreenCaptureOrientation.PORTRAIT; // 固定竖屏 // 可选参数设置视频的采集区域必须在原始的视频数据之内单位为像素px config.cropRect new Rect(left, top, right, bottom); engine.updateScreenCaptureConfig(config);4.5 监听屏幕共享回调通知开发者需要监听 IZegoEventHandler 类中的以下回调onScreenCaptureStart 回调接收开始屏幕采集成功的通知方便做后续业务处理如 UI 提示或应用跳转等。onScreenCaptureExceptionOccurred 回调接收屏幕共享过程中的异常信息通知从而可分析屏幕共享失败的原因。public void setEngineEventHandler(){ engine.setEventHandler(new IZegoEventHandler() { Override public void onScreenCaptureExceptionOccurred(ZegoScreenCaptureExceptionType exceptionType) { super.onScreenCaptureExceptionOccurred(exceptionType); AppLogger.getInstance().receiveCallback(screen capture exception occurred: %s, exceptionType); } Override public void onScreenCaptureStart() { super.onScreenCaptureStart(); AppLogger.getInstance().receiveCallback(screen capture start); } }); }4.6 登录房间并开始推流调用 loginRoom 接口传入房间 ID 参数 “roomID” 和用户参数 “user”登录房间。调用 startPublishingStream 接口传入流 ID 参数 “streamID”向远端用户发送本端的音视频流。// 创建用户 ZegoUser user new ZegoUser(user1); // 开始登录房间 engine.loginRoom(room1, user); // 开始推流 engine.startPublishingStream(stream1);至此我们已完成采集屏幕数据并通过 ZEGO Express SDK 分享到远端的操作。4.7 观看远端屏幕共享完成以上步骤之后其他用户可以使用 startPlayingStream 接口拉取屏幕共享流。// 拉流播放需传入发起屏幕共享的用户推流时所用的 streamID engine.startPlayingStream(streamID, new ZegoCanvas(playView));4.8 停止屏幕共享用户可以调用 stopScreenCapture 接口停止共享。engine.stopScreenCapture();5 获取屏幕共享 SDK 更多帮助如果你在接入过程中遇到问题可以参考下方常见问题或官方文档进一步排查。近期有项目规划可以了解 RTC 产品报价或点击官网右侧联系商务咨询折扣。6 Android 屏幕共享常见问题FAQ1. Android 屏幕共享时出现黑屏或闪屏是什么原因问题描述开启屏幕共享后画面短暂显示后变黑或频繁闪屏。常见原因横竖屏切换导致采集异常最常见系统权限未完全授予部分厂商 ROM如 MIUI / EMUI限制后台采集解决方案保持 App 与设备方向一致避免强制横竖屏冲突检查是否正确获取MediaProjection权限避免频繁切换 Activity 或重建采集实例2. Android 设备固定竖屏时屏幕共享弹窗方向异常怎么办问题描述开启屏幕共享时系统授权弹窗方向异常甚至导致黑屏。原因设备固定竖屏与 App 横屏界面冲突引发系统数据异常。解决方案修改 AndroidManifest 中 SDK Activity 的screenOrientation为unspecified使用tools:replace覆盖默认配置或开启系统自动旋转功能3. Android 屏幕共享为什么没有声音问题描述共享画面正常但对方听不到系统声音或应用声音。常见原因未开启系统音频采集Android 10 才支持使用普通麦克风采集未使用系统音频通道部分应用如 DRM 视频禁止音频采集解决方案使用系统音频采集接口AudioPlaybackCapture API确认 targetSdkVersion ≥ 29避免采集受保护内容如 Netflix4. Android 屏幕共享画面卡顿或延迟高怎么办问题描述共享画面卡顿、不流畅或延迟明显。常见原因编码参数设置过高分辨率 / 帧率网络带宽不足或波动设备性能不足尤其是低端机解决方案降低分辨率如 720p → 480p限制帧率建议 10–15fps使用硬件编码H.264 / H.2655. Android 屏幕共享时出现崩溃Crash如何排查问题描述开启或停止屏幕共享时应用崩溃。常见原因MediaProjection 生命周期管理错误重复创建 VirtualDisplay未正确释放资源解决方案确保 MediaProjection 只初始化一次在 onStop 中释放 VirtualDisplay避免多线程同时操作采集对象6. Android 屏幕共享为什么分辨率异常或画面拉伸问题描述共享画面比例不对出现拉伸或压缩。常见原因采集分辨率与设备实际分辨率不匹配横竖屏切换未同步更新参数解决方案动态获取设备分辨率DisplayMetrics横竖屏切换时重新配置采集参数保持宽高比一致如 16:97. Android 屏幕共享权限弹窗无法弹出怎么办问题描述调用屏幕共享时没有出现系统授权弹窗。常见原因Context 使用错误非 Activity权限请求流程异常被系统或厂商 ROM 拦截解决方案确保使用 Activity 调用 MediaProjectionManager检查 startActivityForResult 流程在前台触发权限请求8. Android 屏幕共享在后台被中断怎么办问题描述切到后台后屏幕共享自动停止。常见原因系统省电策略限制未使用前台服务Foreground Service厂商系统强杀进程解决方案使用 Foreground Service 保活关闭电池优化Doze 模式针对厂商机型做适配白名单机制9. Android 屏幕共享如何实现远程控制反向操作问题描述不仅要共享屏幕还需要远程控制另一台设备。核心难点Android 原生不支持直接远程控制需要额外输入注入能力Accessibility / ADB解决方案结合 AccessibilityService 实现点击/滑动注入或通过 ADB / 无障碍服务实现控制能力通常需配合实时音视频 SDK 传输控制信号10. Android 屏幕共享在不同厂商设备上表现不一致怎么办问题描述不同品牌手机如小米、华为、OPPO表现差异明显。原因ROM 定制导致权限和后台策略不同编码能力差异硬件编码支持不同解决方案建立机型兼容性测试列表针对主流厂商做专项适配使用 SDK 内置兼容策略如 ZEGO 即构、声网 Agora、腾讯云 TRTC本文主要介绍了 Android 设备之间实现屏幕共享与远程控制的基础接入流程结合实际开发中常见问题对横竖屏适配、权限处理及稳定性问题进行了说明。通过这些能力可以快速搭建远程协助、设备控制、内容共享等典型场景。围绕屏幕共享与实时互动能力我们还会持续整理更多细分场景与实现细节包括但不限于Android 屏幕共享完整实现流程与关键参数配置屏幕共享 实时音视频RTC组合方案实践远程控制实现机制输入注入、无障碍能力等解析常见问题与兼容性适配黑屏、卡顿、权限异常等跨端场景Android / iOS / Web屏幕共享方案对比本系列将围绕「RTC SDK 接入与实时互动能力实现」持续更新适合需要构建屏幕共享、远程协作及实时互动能力的开发者参考。

更多文章