You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:34:58