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

Android 15 前台服务无法获取音频焦点问题排查求助

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的行为变更以及音频焦点相关的官方文档,但还是没找到问题所在,目前的配置和实现逻辑如下:

  1. 清单文件配置
    已经添加了对应的前台服务权限,并指定了服务的前台类型:

    <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" />
    
  2. 服务启动逻辑
    从UI界面通过PendingIntent.getForegroundService()创建服务意图,结合AlarmManager.setAlarmClock()来设置闹钟触发服务:

    val intent = Intent(context, AlarmService::class.java)
    val pendingIntent = PendingIntent.getForegroundService(/* 相关参数 */)
    systemAlarmManager.setAlarmClock(/* 闹钟配置 */, pendingIntent)
    
  3. 服务内部实现
    在服务的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:29:34