You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android应用编程开启免打扰并设置媒体播放例外的方法咨询

解决Android免打扰模式下允许媒体播放的问题

你已经搞定了基础的免打扰开启逻辑,现在要让媒体播放不受免打扰影响,核心是通过NotificationPolicy配置专属的例外规则,确保媒体音频能正常工作。下面是具体的实现方案:

核心思路

从Android 6.0(API 23)开始,系统允许通过NotificationPolicy.Builder自定义免打扰的例外规则,我们可以用它替代单纯设置INTERRUPTION_FILTER_NONE的方式,在开启免打扰的同时保留媒体播放权限。

完整代码实现

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    if (notificationManager.isNotificationPolicyAccessGranted) {
        Log.d(Globals.LOG_TAG, "已获取免打扰权限,配置媒体例外")
        
        val policyBuilder = NotificationPolicy.Builder()
            // 基础设置:开启完全免打扰模式
            .setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE)
            
        // 针对不同Android版本做兼容处理
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // API 24及以上:精准允许媒体音频通道正常播放
            policyBuilder.setAllowedAudioChannels(NotificationPolicy.AUDIO_CHANNEL_MEDIA)
        } else {
            // API 23:允许媒体类优先级的通知/声音突破免打扰
            policyBuilder.setPriorityCategories(NotificationPolicy.PRIORITY_CATEGORY_MEDIA)
        }
        
        // 如果需要额外保留闹钟、来电等例外,可添加对应常量
        // policyBuilder.setPriorityCategories(NotificationPolicy.PRIORITY_CATEGORY_ALARM or NotificationPolicy.PRIORITY_CATEGORY_CALL)
        
        val notificationPolicy = policyBuilder.build()
        notificationManager.setNotificationPolicy(notificationPolicy)
    } else {
        Log.d(Globals.LOG_TAG, "未获取免打扰权限,引导用户设置")
        val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
        startActivity(intent)
    }
} else {
    Log.d(Globals.LOG_TAG, "设备不支持免打扰功能")
}

关键细节说明

  • 权限确认:你已经正确添加了ACCESS_NOTIFICATION_POLICY权限声明,也做了权限引导逻辑,这部分可以继续保留,确保用户能正常开启权限。
  • 版本兼容
    • API 23(Android 6.0):只能通过setPriorityCategories指定媒体类优先级,让媒体相关通知突破免打扰。
    • API 24(Android 7.0)及以上:新增了setAllowedAudioChannels方法,可以更精准地放行媒体音频通道,不会影响其他类型的通知静音。
  • 扩展例外:如果需要同时允许闹钟、来电等功能,只需在对应方法中添加常量即可(比如NotificationPolicy.PRIORITY_CATEGORY_ALARM对应闹钟,NotificationPolicy.AUDIO_CHANNEL_CALL对应来电)。

验证方法

设置完成后可以这样测试:

  1. 触发代码开启免打扰模式
  2. 播放应用内的音乐、视频等媒体内容
  3. 确认媒体声音正常播放,同时普通通知(如短信、APP推送)保持静音状态

内容的提问来源于stack exchange,提问作者user3927415

火山引擎 最新活动