当前位置: 首页 > news >正文

Android使用MediaProjectionManager获取游戏画面和投屏

MediaProjectionManager 是 Android 系统中实现屏幕录制和截屏功能的管理器,允许应用请求用户授权并获取屏幕投影,进而实现屏幕内容的录制或截图 。

使用步骤

  • 获取 MediaProjectionManager 实例:

通过 getSystemService(Context.MEDIA_PROJECTION_SERVICE) 获取 。

  • 请求权限:

使用 createScreenCaptureIntent() 创建用于请求屏幕捕获权限的 Intent,并通过 startActivityForResult() 启动该 Intent 。此时系统会显示请求授权的弹窗。

  • 处理授权结果:

在 onActivityResult() 中,判断弹窗成功授权后启动服务。若结果码为 RESULT_OK,则通过 getMediaProjection(resultCode, data) 获取 MediaProjection 对象 。

  • 创建 VirtualDisplay:

使用 MediaProjection.createVirtualDisplay() 创建虚拟显示,传入屏幕宽度、高度、密度等参数,并指定一个 Surface(如 ImageReader 或 SurfaceView 的 Surface)以捕获屏幕内容 。

createVirtualDisplay 说明

参数详解

参数名

含义说明

name

虚拟显示的名称,不能为空字符串。

width

虚拟屏幕的宽度(像素),必须 > 0。

height

虚拟屏幕的高度(像素),必须 > 0。

densityDpi

屏幕密度(dpi),建议与真实屏幕一致,可通过 DisplayMetrics 获取。

flags

控制虚拟显示行为的标志位,如 VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR 等。

surface

渲染目标,通常是 ImageReaderMediaRecorderMediaCodecSurface

callback

监听虚拟显示状态变化的回调,可为 null

handler

指定回调线程的 Handler,可为 null(默认主线程)。

常用 Flags

Flag 名称

含义说明

VIRTUAL_DISPLAY_FLAG_PUBLIC

公共显示,允许其他应用在此显示上打开窗口。默认是私有的。

VIRTUAL_DISPLAY_FLAG_PRESENTATION

设置为演示显示,常用于双屏展示场景。

VIRTUAL_DISPLAY_FLAG_SECURE

安全显示,防止内容被截屏/录制(需系统权限)。

VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY

仅显示自己的内容,不镜像其他屏幕内容。

VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR

自动镜像主屏幕内容(常用于录屏)。需要 MediaProjection 权限支持。

示例代码:

val mediaProjectionManager = getSystemService(MediaProjectionManager::class.java)
val startMediaProjection = registerForActivityResult(StartActivityForResult()) { result ->if (result.resultCode == RESULT_OK) {val mediaProjection = mediaProjectionManager.getMediaProjection(result.resultCode, result.data!!)val displayMetrics = resources.displayMetricsval surface = mediaRecorder.surface // 也可以是 ImageReader.getSurface()val virtualDisplay = mediaProjection.createVirtualDisplay("ScreenCapture",displayMetrics.widthPixels,displayMetrics.heightPixels,displayMetrics.densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,surface,null,null)}
}
startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())

如需进一步处理画面(如截图或编码),可将 Surface 替换为 ImageReader 或 MediaCodec 的输入 Surface,灵活适配不同使用场景。

注意事项

  • Android 5.0 及以上版本支持 MediaProjection 功能 。

  • 需处理用户拒绝授权的情况,确保良好的用户体验 。

  • 在 Android 10 及以上版本中,注意存储权限等适配问题 。

  • 权限要求:必须在每次使用前通过 createScreenCaptureIntent() 获取用户授权。

  • 一次性使用:Android 14+ 中,MediaProjection 令牌只能用于一次 createVirtualDisplay() 调用。

  • 资源释放:使用完后必须调用 virtualDisplay.release()mediaProjection.stop(),避免内存泄漏。

http://www.xdnf.cn/news/1226431.html

相关文章:

  • 应用药品注册证识别技术,为医药行业的合规、高效与创新发展提供核心驱动力
  • TwinCAT3示例项目1
  • 探索 VMware 虚拟机:开启虚拟化世界的大门
  • 学习游戏制作记录(各种水晶能力以及多晶体)8.1
  • 新手小白如何快速检测IP 的好坏?
  • Vue2 项目实现 Gzip 压缩全攻略:从配置到部署避坑指南
  • 基于coze studio开源框架二次定制开发教程
  • 【MySQL索引失效场景】索引失效原因及最左前缀原则详解
  • OSPF综合实验报告册
  • Qt 开发 IDE 插件开发指南
  • 【文章素材】3dBackgroundBoxes(3D背景盒子组件)项目及文章思路
  • 从游戏NPC到手术助手:Agent AI重构多模态交互,具身智能打开AGI新大门
  • Spring之【循环引用】
  • SpringCloud(一)微服务基础认识
  • Transformer架构全解析:搭建AI的“神经网络大厦“
  • 从零到英雄:掌握神经网络的完整指南
  • Spotlight on MySQL 300安装教程(附使用指南):实时监控MySQL性能的工具
  • 60 GHz DreamHAT+ 雷达已被正式批准为“Powered by Raspberry Pi”产品
  • 学习笔记:原子操作与锁以及share_ptr的c++实现
  • 下载一个JeecgBoot-master项目 导入idea需要什么操作启动项目
  • 小杰数据结构(four day)——藏器于身,待时而动。
  • 十、SpringBootWeb快速入门-入门案例
  • 李宏毅深度学习教程 第4-5章 CNN卷积神经网络+RNN循环神经网络
  • 大模型开发框架LangChain之构建知识库
  • 暑期算法训练.12
  • 人员定位卡人脸智能充电发卡机
  • 【PHP】接入百度AI开放平台人脸识别API,实现人脸对比
  • 【无标题】严谨推导第一代宇宙的创生机制,避免无限回溯问题。
  • 预测性维护之温振传感器选型与应用秘籍
  • 在线免费的AI文本转语音工具TTSMaker介绍