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

Android MediaProjection实战:从权限适配到异常处理,构建Android Q+的稳定截屏录屏功能

1. 理解MediaProjection的核心机制在Android Q及以上版本中MediaProjection API是系统级截屏和录屏功能的唯一官方入口。与早期版本直接调用adb screencap或反射获取Surface不同这套机制通过用户显式授权的方式实现隐私保护。我曾在多个项目中遇到过因理解不透彻导致的权限闪退问题这里分享几个关键认知点首先MediaProjection本质上是一个虚拟显示管道。当用户授权后系统会创建一个独立于应用窗口的图形层这个层可以捕获包括状态栏、导航栏在内的整个屏幕内容。实测发现在小米MIUI 14上如果未正确绑定前台服务这个管道会在后台被系统强制回收。其次权限流程有严格的生命周期要求。必须通过startActivityForResult()触发系统弹窗且结果回调必须立即处理。遇到过开发者将MediaProjection实例存储在静态变量中结果应用重启后再次使用时直接抛出IllegalStateException。正确的做法是用onSaveInstanceState保存token并在onCreate中重建。// 典型错误示例静态存储MediaProjection public static MediaProjection sMediaProjection; // 会导致内存泄漏和状态失效 // 正确做法使用非静态变量状态保存 private MediaProjection mMediaProjection; Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode REQUEST_CODE) { mMediaProjection mediaProjectionManager.getMediaProjection(resultCode, data); // 必须立即启动前台服务 startForegroundService(); } }最后要注意API的版本差异。从Android 12开始系统要求每次录屏必须显示持续通知而不仅仅是绑定前台服务。我在适配Pixel 6时发现如果通知栏没有常驻的录制标识10秒后必定会被系统中断。2. 权限申请的避坑指南申请MediaProjection权限看似简单但实际开发中90%的崩溃都发生在这个环节。根据在OPPO ColorOS上的测试数据正确处理以下三个场景才能确保稳定2.1 动态权限的叠加检查在Android Q上需要同时满足Manifest.permission.RECORD_AUDIO如需录制声音READ_EXTERNAL_STORAGE如需保存到公共目录运行时弹窗的MediaProjection授权常见错误是只检查了第3项。建议封装一个统一的检查工具类public boolean checkAllPermissions() { return checkSelfPermission(RECORD_AUDIO) PERMISSION_GRANTED checkSelfPermission(READ_EXTERNAL_STORAGE) PERMISSION_GRANTED buildSdkBelow(TIRAMISU) // Android 13不需要READ_EXTERNAL_STORAGE isMediaProjectionReady(); // 检查是否已授权 }2.2 厂商ROM的特殊处理华为EMUI和小米MIUI存在以下差异华为必须在onResume中检查权限后台返回时可能被回收小米需要额外申请悬浮窗权限才能正常显示系统弹窗三星One UI会限制每次录屏最长30分钟建议在应用启动时增加ROM检测逻辑if (isXiaomi()) { Intent intent new Intent(miui.intent.action.APP_PERM_EDITOR); intent.putExtra(extra_pkgname, getPackageName()); startActivity(intent); // 跳转权限设置页 }2.3 拒绝授权的恢复策略用户首次拒绝后后续再调用createScreenCaptureIntent()可能直接崩溃。解决方案是捕获SecurityException引导用户前往设置页手动开启使用PackageManager.clearPackagePreferredActivities()重置选择3. 前台服务的正确绑定姿势Android 10引入的后台限制政策对录屏影响极大。在三星Galaxy S22上测试发现未绑定服务的应用平均存活时间仅17秒。以下是经过验证的稳定方案3.1 服务声明与通知渠道service android:name.ScreenCaptureService android:foregroundServiceTypemediaProjection android:exportedfalse/必须指定foregroundServiceType属性否则Android 12会拒绝启动。通知渠道需要设置IMPORTANCE_LOW避免打扰用户NotificationChannel channel new NotificationChannel( CHANNEL_ID, 屏幕录制, IMPORTANCE_LOW // 不要使用DEFAULT或HIGH ); channel.setShowBadge(false); // 隐藏角标3.2 服务的生命周期管理建议采用双向绑定模式Activity通过bindService()关联服务服务内部维持START_STICKY的start方式在onTaskRemoved中重新创建服务实测发现这种模式可以让录屏在华为Mate 50 Pro上持续运行超过6小时不被杀。3.3 内存优化技巧录屏时内存占用容易突破500MB建议使用ImageReader.setMaxImages(2)限制缓冲队列选择RGB_565替代ARGB_8888格式定期调用System.gc()仅针对长时间录制4. 异常处理全攻略4.1 常见异常类型及解决方案异常类型触发场景修复方案SecurityException权限未授予或token失效重新申请权限IllegalStateException重复创建VirtualDisplay检查display是否已释放IOException存储空间不足切换保存路径RuntimeException厂商ROM限制添加白名单检测4.2 崩溃日志分析实战以这段崩溃日志为例E/AndroidRuntime: Caused by: java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION说明缺少服务类型声明解决方法在AndroidManifest添加foregroundServiceType确保服务启动前调用startForeground()4.3 稳定性监控方案建议集成以下检测点使用ActivityManager.getMyMemoryState()监控是否进入后台通过FileObserver监听输出文件是否被系统删除定时检查VirtualDisplay.isValid()Handler handler new Handler(); Runnable checkRunnable new Runnable() { Override public void run() { if (!mVirtualDisplay.isValid()) { recoverFromCrash(); } handler.postDelayed(this, 5000); } };5. 性能优化进阶技巧在Redmi Note 11上的测试数据显示经过优化后CPU占用降低42%内存峰值下降58%。关键优化点包括5.1 帧率动态调节根据设备性能自动调整帧率int targetFps 30; if (Build.MODEL.contains(Galaxy S)) { targetFps 60; // 旗舰机型启用高帧率 } mVirtualDisplay.setSurface(surface, targetFps);5.2 智能编码参数选择使用MediaCodec时建议配置mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, width * height * 5); // 5bps/px平衡画质和体积 mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2);5.3 低内存设备的特殊处理针对内存小于4GB的设备将ImageReader的格式改为ImageFormat.YUV_420_888禁用音频录制降低分辨率到720p6. 厂商设备兼容性报告根据2023年测试数据各品牌主要问题如下华为需要单独申请后台弹出界面权限小米开发版ROM会限制每次录屏时长OPPOColorOS 13会压缩超过100MB的视频vivoOriginOS自动清理/sdcard/Android/data目录解决方法是在应用启动时检查设备型号动态调整参数if (isOppo()) { mEncoder.setOutputFormat(MediaRecorder.OutputFormat.WEBM); // OPPO对WEBM格式更友好 }7. 调试工具链搭建推荐使用这套调试方案ADB监控adb shell dumpsys activity broadcasts | grep screen性能分析Android Studio的CPU Profiler内存检测adb shell dumpsys meminfo package_name关键日志过滤命令adb logcat | grep -E MediaProjection|VirtualDisplay8. 实际项目中的经验之谈在金融类App中实现安全录屏时我们发现三个关键点必须禁用setSecure(true)的窗口捕获水印需要直接渲染到Surface层视频加密建议使用AES-256HMAC双重保护一个典型的加密实现Cipher cipher Cipher.getInstance(AES/CBC/PKCS5Padding); cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); MediaCodec cryptoCodec MediaCodec.createByCodecName(c2.android.avc.encoder); cryptoCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

相关文章:

Android MediaProjection实战:从权限适配到异常处理,构建Android Q+的稳定截屏录屏功能

1. 理解MediaProjection的核心机制 在Android Q及以上版本中,MediaProjection API是系统级截屏和录屏功能的唯一官方入口。与早期版本直接调用adb screencap或反射获取Surface不同,这套机制通过用户显式授权的方式实现隐私保护。我曾在多个项目中遇到过因…...

终极视频字幕提取指南:用Video-subtitle-extractor轻松获取87种语言字幕

终极视频字幕提取指南:用Video-subtitle-extractor轻松获取87种语言字幕 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕…...

Windows XP图标主题完整指南:轻松为Linux桌面注入经典怀旧风格

Windows XP图标主题完整指南:轻松为Linux桌面注入经典怀旧风格 【免费下载链接】Windows-XP Remake of classic YlmfOS theme with some mods for icons to scale right 项目地址: https://gitcode.com/gh_mirrors/win/Windows-XP 还在怀念Windows XP那个经典…...

OpenFOAM-dev后处理与数据可视化:ParaView与fieldFunctionObjects实战指南

OpenFOAM-dev后处理与数据可视化:ParaView与fieldFunctionObjects实战指南 【免费下载链接】OpenFOAM-dev OpenFOAM Foundation development repository 项目地址: https://gitcode.com/gh_mirrors/op/OpenFOAM-dev OpenFOAM-dev作为开源CFD领域的核心工具&a…...

qmcdump:3步轻松解锁QQ音乐加密文件,实现跨设备音乐自由

qmcdump:3步轻松解锁QQ音乐加密文件,实现跨设备音乐自由 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdu…...

基于Node.js与whatsapp-web.js构建WhatsApp AI聊天机器人全流程解析

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫harshitethic/whatsapp-chatgpt。光看名字,很多朋友可能就猜到了,这是一个把ChatGPT的能力集成到WhatsApp里的工具。简单来说,就是让你能在WhatsApp里直接和AI对话&…...

MANT量化技术:大语言模型推理的硬件架构革新

1. MANT量化技术:大语言模型推理的硬件架构革新在人工智能领域,大语言模型(LLM)的推理效率一直是制约其实际应用的关键瓶颈。传统量化方法往往面临精度损失与硬件适配的双重挑战,而MANT技术的出现为这一困境提供了创新解决方案。作为一名深耕…...

Degrees of Lewdity汉化版全攻略:从入门到精通的四象限实战指南

Degrees of Lewdity汉化版全攻略:从入门到精通的四象限实战指南 价值定位:为什么选择模组化汉化方案? 你是否曾因语言障碍与心仪的开源游戏失之交臂?Degrees of Lewdity作为一款备受欢迎的开源游戏,其丰富的剧情和自…...

Degrees of Lewdity 本地化实践指南

Degrees of Lewdity 本地化实践指南 Degrees of Lewdity 作为一款开源游戏,其本地化实践是打破语言壁垒、实现文化适配的关键环节。本文将从本地化价值定位、环境适配、执行蓝图、故障诊断、进阶优化到生态导航,为零基础用户提供一套完整的本地化技术方…...

从零开始将Taotoken接入现有Nodejs项目实践步骤

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从零开始将Taotoken接入现有Nodejs项目实践步骤 1. 准备工作:获取API密钥与模型信息 在开始代码改造之前,…...

从批判到机遇:技术人的思维重塑与硬科技创新实践

1. 从“批判”到“机遇”:一位科技编辑的思维重塑之旅最近和几位在芯片设计公司工作的老朋友聊天,话题总是不自觉地绕回到行业现状上:摩尔定律逼近物理极限,研发成本指数级攀升,全球供应链的波动……大家言语间多少带着…...

Qt Creator装完想清理?用对MaintenanceTool一键卸载不残留(附Linux权限问题解决)

Qt Creator彻底卸载指南:MaintenanceTool高阶使用与Linux权限问题全解析 Qt作为跨平台开发框架的标杆,其安装包体积日益庞大,从基础组件到附加工具动辄占用数十GB空间。当开发者需要切换版本、释放磁盘或解决环境冲突时,如何实现零…...

碧蓝航线Live2D模型提取:3步快速获取游戏角色资源的完整指南

碧蓝航线Live2D模型提取:3步快速获取游戏角色资源的完整指南 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 你是否曾经想提取碧蓝航线中精美的Li…...

5分钟快速上手:roop-unleashed AI换脸神器完全指南

5分钟快速上手:roop-unleashed AI换脸神器完全指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 想要在几分钟内制作专业级AI换脸视频吗&…...

别再被防火墙挡在门外!FileZilla Server在Windows下的完整端口放行指南(含被动模式配置)

FileZilla Server在Windows环境下的防火墙配置与端口管理实战 "为什么我的FTP客户端能连接却无法列出目录?"——这是许多初次配置FileZilla Server的用户常遇到的困惑。Windows防火墙就像一位严格的保安,如果不清楚FTP协议的特殊性&#xff0c…...

基于Python与yfinance构建本地化股票量化筛选器:以PKScreener为例

1. 项目概述与核心价值 最近在和一些做量化交易的朋友交流时,发现大家普遍面临一个痛点:虽然市面上有各种股票数据接口和量化平台,但真正能快速、灵活地根据自定义条件进行股票筛选,并且能本地化部署、深度定制的工具却不多。要么…...

低成本传感器动态校准:SenDaL框架原理与应用

1. 低成本传感器校准的行业痛点与SenDaL解决方案在智能家居和工业物联网领域,我们经常面临一个尴尬的境地:高精度传感器价格昂贵难以大规模部署,而低成本传感器的数据质量又令人担忧。以PM2.5监测为例,专业级β射线传感器的价格可…...

基于大语言模型的私有化AI健康助手:Open Health Agent设计与实践

1. 项目概述:一个真正属于你的AI健康数据管家 最近几年,我自己的健康数据越来越“散装”了。体重秤的数据在App A里,跑步机的记录在App B里,偶尔在微信上跟朋友吐槽一句“昨晚又没睡好”,这些碎片化的信息就像沙滩上的…...

SpringBoot生产级监控与异常日志运维实战,线上项目稳定排查不慌

SpringBoot项目本地开发调试正常,部署到生产环境后频繁出现接口报错、服务卡顿、内存溢出、接口响应缓慢、数据库连接耗尽等线上问题,开发者无法实时查看项目运行状态,报错无精准日志定位,排查问题耗时费力,严重影响业…...

Tome:基于MCP协议的无代码AI桌面助手,轻松连接本地与云端模型

1. 项目概述:Tome,一个为普通人打造的魔法AI桌面应用 如果你对大型语言模型(LLM)和AI助手感兴趣,但又觉得那些命令行工具、复杂的API配置和JSON文件让人望而却步,那么Tome的出现,可能就是为你准…...

告别WSL安装玄学:从0x80072f78到0x800701bc,一次搞懂Windows 11下的完整避坑指南

从0x80072f78到0x800701bc:Windows 11下WSL完整避坑手册 每次在Windows 11上安装WSL时,那些神秘的错误代码是否让你抓狂?0x80072f78、0x800701bc...它们像是一道道密码,阻挡着你进入Linux开发环境的大门。作为长期在Windows和Linu…...

避坑指南:SuperMap iServer 跨版本升级时,备份恢复配置文件必须注意的3个细节

SuperMap iServer跨版本升级:配置文件备份恢复的三大关键策略 当技术团队准备将SuperMap iServer从10i版本升级到11i时,最容易被忽视却最致命的环节莫过于配置文件的处理。许多工程师习惯性地将旧版本备份包直接恢复到新环境,结果遭遇服务启动…...

Win11精简版系统缺失画图工具?三步教你从微软商店找回(附快速启动技巧)

Win11精简版系统缺失画图工具?三步教你从微软商店找回(附快速启动技巧) 不少追求系统流畅性的用户会选择安装第三方精简版Win11系统,却在需要基础功能时发现连画图工具都找不到了。这并非微软的疏漏,而是精简版系统为了…...

为什么2025年是AI Agent的爆发元年?

目录为什么2025年是AI Agent的爆发元年?引言:一个被产业界共同认定的“元年”一、产业共识:为什么“元年”不是一个空洞的口号?1.1 从“千模大战”到“智能体竞速”1.2 权威机构的一致判断1.3 市场规模的数据佐证二、技术底座&…...

03-从Chat到Act-Agent行动闭环的产品心理学拆解

从Chat到Act:Agent行动闭环的产品心理学拆解系列一:AI Agent GAP模型 | 第3篇(深度型) 从"一问一答"到"自主行动",拆解Agent行动闭环背后的行为设计逻辑。本文你将获得 🔄 Agent行动闭…...

基于Nuxt 4与Shadcn/ui的现代全栈仪表板开发实战

1. 项目概述:一个现代全栈仪表板的技术栈选择 最近在做一个内部管理后台,需要快速搭建一个既美观又功能齐全的仪表板。我的核心需求很明确:开发要快、代码质量要高、用户体验要好,并且要能轻松应对多语言场景。在评估了市面上各种…...

基于Telegram的AI聊天机器人SirChatalot部署与多模态功能配置指南

1. 项目概述:打造你的专属AI骑士 如果你厌倦了那些功能单一、反应迟钝的聊天机器人,想拥有一个既能深度对话、又能看图说话、甚至能帮你搜索网页和生成图片的“全能型”AI伙伴,那么 SirChatalot 这个项目绝对值得你投入时间。它本质上是一个…...

RHClaw红队工具集:模块化CLI框架提升安全研究效率

1. 项目概述与核心价值最近在和一些做安全研究的朋友交流时,发现一个挺有意思的现象:大家手里或多或少都攒了一些自己写的、或者从开源社区淘来的“小工具”。这些工具往往功能单一但极其锋利,比如一个专门用来解析特定协议头的脚本&#xff…...

契约驱动开发:用AI守护代码质量,告别技术债

1. 项目概述:从“技术债”到“可持续开发”的范式转变 如果你和我一样,长期在技术一线摸爬滚打,那你一定对“技术债”这个词又爱又恨。爱它,是因为它给了我们一个快速交付的借口;恨它,是因为它总在项目最脆…...

ReRAM与PCM存内计算:突破冯·诺依曼瓶颈,赋能边缘AI与类脑计算

1. 从冯诺依曼瓶颈到存内计算:一场芯片架构的范式转移最近几年,但凡关注芯片和人工智能领域的朋友,肯定对“存内计算”这个词不陌生。它听起来像是一个技术术语,但背后直指一个困扰了我们半个多世纪的计算机根本性难题&#xff1a…...