适配Android 14(SDK 34)触发SecurityException崩溃的原因排查
适配SDK 34(Android 14)后,仅在Galaxy A13和A72两款Android 14设备上出现少量前台服务启动崩溃,崩溃日志如下:
java.lang.SecurityException: Starting FGS with type mediaProjection callerApp=ProcessRecord{44a8006 6938:com.foo/u0a6} targetSDK=34 requires permissions: all of the permissions allOf=true [android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION] any of the permissions allOf=false [android.permission.CAPTURE_VIDEO_OUTPUT, android:project_media] at android.os.Parcel.createExceptionOrNull(Parcel.java:3069) at android.os.Parcel.createException(Parcel.java:3053) at android.os.Parcel.readException(Parcel.java:3036) at android.os.Parcel.readException(Parcel.java:2978) at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:7214) at android.app.Service.startForeground(Service.java:775) at com.foo.FooService.onStartCommand(FooService.java:28)
可能的原因分析:
权限配置或声明问题:
Android 14要求MediaProjection类型的前台服务必须声明android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION权限,同时需持有CAPTURE_VIDEO_OUTPUT或project_media二者之一。即便你已在Manifest中声明权限,三星One UI定制ROM可能对权限校验逻辑更严格——比如权限声明位置错误(需放在<manifest>标签下而非<application>内),或者动态申请权限的时序存在问题(启动前台服务前未确保权限已完全授予)。三星定制ROM的权限校验差异:
Galaxy A13和A72搭载的One UI版本在前台服务权限校验逻辑上可能与原生Android 14存在差异。原生系统允许的部分临时豁免场景,在三星ROM中被收紧,导致边缘场景触发权限异常。前台服务启动时机不当:
若FooService在MediaProjection会话尚未完全初始化时就调用startForeground(),三星设备可能会判定权限不满足。比如获取MediaProjection实例后立即启动前台服务,未等待会话建立完成,此时设备尚未正确识别已授予的投影权限。权限授予状态异常未处理:
部分用户可能在授予权限后通过系统设置撤销,但应用未处理权限被撤销的场景,导致启动前台服务时触发SecurityException。三星设备的权限管理逻辑可能让这种场景更容易触发崩溃。
内容的提问来源于stack exchange,提问作者Mark

