Android 15 前台服务无法获取音频焦点问题排查求助
各位好,我正在开发一款闹钟类应用,目前卡在了Android 15上的音频焦点获取问题上——当闹钟触发时,我的应用始终无法获取到音频焦点,系统直接拦截了请求,具体情况如下:
问题日志
2025-08-14 08:36:27.935 601-1038 AS.HardeningEnforcer system_server I Focus request DENIED for uid:10216 clientId:android.media.AudioManager@83ae10bigalex321.audiofocustest.AlarmService$$ExternalSyntheticLambda0@77a2d09 req:2 procState:4
2025-08-14 08:36:27.935 601-1038 AS.AudioService system_server W Audio focus request blocked by hardening
从日志能看出来,系统的HardeningEnforcer模块认为我的服务不是前台服务,所以直接拦截了音频焦点请求。
我已经做的配置和逻辑
我已经查阅了Android 15的行为变更以及音频焦点相关的官方文档,但还是没找到问题所在,目前的配置和实现逻辑如下:
清单文件配置
已经添加了对应的前台服务权限,并指定了服务的前台类型:<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /> ... <service android:name=".AlarmService" ... android:foregroundServiceType="mediaPlayback|systemExempted" />服务启动逻辑
从UI界面通过PendingIntent.getForegroundService()创建服务意图,结合AlarmManager.setAlarmClock()来设置闹钟触发服务:val intent = Intent(context, AlarmService::class.java) val pendingIntent = PendingIntent.getForegroundService(/* 相关参数 */) systemAlarmManager.setAlarmClock(/* 闹钟配置 */, pendingIntent)服务内部实现
在服务的onStartCommand方法中,我第一时间就调用ServiceCompat.startForeground()将服务设为前台,并且指定了对应的服务类型:ServiceCompat.startForeground( this, notificationId, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED or ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK )之后尝试获取音频焦点,焦点请求的构建代码如下:
private val audioFocusRequest: AudioFocusRequest? by lazy { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT) .setAudioAttributes( AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() ) .setOnAudioFocusChangeListener { /* 日志记录逻辑 */ } .build() } else null }成功获取焦点后,我会使用
AudioManager和Vibrator来播放闹钟铃声和振动。
我的困惑
我已经按照官方文档的要求,配置了所有相关的权限、前台服务类型,也确保服务启动后立即进入前台状态,但系统还是不认可我的服务是前台服务,导致音频焦点请求被拦截。有没有朋友能帮我指出我哪里遗漏了?
内容来源于stack exchange

