Android 14(SDK34)启动MediaProjection前台服务遇SecurityException问题
Android 14(SDK 34)适配前台服务SecurityException排查与解决
问题复现
应用在Android 13上运行正常,适配Android 14启动前台服务时抛出SecurityException,错误提示需android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION权限,以及android.permission.CAPTURE_VIDEO_OUTPUT或android:project_media二者之一,但应用并未使用相机。已按官方文档配置Manifest权限与前台服务类型,流程为创建ScreenCaptureService→请求屏幕捕获权限→授权后启动前台服务,但仍报错。后续发现ContextCompat.checkSelfPermission始终返回PERMISSION_DENIED,MediaProjection无法通过授权后的Intent启动,怀疑SDK相关问题。
解决方案
1. 修正Manifest配置
- 确保
FOREGROUND_SERVICE_MEDIA_PROJECTION权限在<manifest>标签下声明:<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" /> - 给前台服务添加正确的类型声明与绑定权限:
<service android:name=".ScreenCaptureService" android:foregroundServiceType="mediaProjection" android:permission="android.permission.BIND_FOREGROUND_SERVICE_MEDIA_PROJECTION" android:exported="false" /> - 补充
project_media权限(Android 14媒体投影权限逻辑强制要求,即便未使用相机):<uses-permission android:name="android.permission.project_media" />
2. 修正权限授权与服务启动逻辑
Android 14对屏幕捕获授权Intent的生命周期做了严格限制,不能缓存授权Intent延迟使用,需在权限回调中立即创建MediaProjection并启动服务:
// 用Activity Result API处理权限回调 val screenCaptureLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK && result.data != null) { // 立即创建MediaProjection实例 val mediaProjection = mediaProjectionManager.getMediaProjection(result.resultCode, result.data!!) // 传递实例启动前台服务 val serviceIntent = Intent(this, ScreenCaptureService::class.java).apply { putExtra("MEDIA_PROJECTION", mediaProjection) } ContextCompat.startForegroundService(this, serviceIntent) } } // 发起屏幕捕获权限请求 val captureIntent = mediaProjectionManager.createScreenCaptureIntent() screenCaptureLauncher.launch(captureIntent)
3. 排查SDK与构建缓存问题
- 升级Android Gradle Plugin(AGP)至8.1+、SDK Build Tools至34.0.0+,排除旧版本SDK的兼容性bug
- 执行
File → Invalidate Caches...清理项目缓存,卸载应用后重新安装测试
4. 修正权限检查逻辑
project_media是应用安装时自动授予的权限,若ContextCompat.checkSelfPermission返回PERMISSION_DENIED,优先检查Manifest配置是否正确,或尝试清理构建缓存、重装应用。
内容的提问来源于stack exchange,提问作者Kolodieiev
相关产品推荐
相关产品推荐

