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

如何在Kotlin中将Media Player设置为闹钟用途并以闹钟音量播放

Android 用 Kotlin 实现 MediaPlayer 以闹钟音量播放

要让MediaPlayer以闹钟音量播放,核心是将其关联到闹钟音频流,并正确配置现代音频属性。以下是适配Android 8.0+的标准实现:

完整代码示例

import android.content.Context
import android.media.AudioAttributes
import android.media.MediaPlayer
import android.os.Build
import androidx.annotation.RequiresApi

class AlarmMediaPlayer(private val context: Context) {
    private var mediaPlayer: MediaPlayer? = null

    @RequiresApi(Build.VERSION_CODES.O)
    fun playAlarmSound(soundResId: Int) {
        // 释放旧实例,避免资源泄漏
        mediaPlayer?.release()
        
        mediaPlayer = MediaPlayer.create(context, soundResId).apply {
            // 配置音频属性:绑定闹钟流,使用闹钟音量
            val audioAttributes = AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build()
            setAudioAttributes(audioAttributes)

            // 可选:设置循环播放
            isLooping = true

            // 准备并启动播放
            try {
                prepare()
                start()
            } catch (e: Exception) {
                e.printStackTrace()
                release()
            }
        }
    }

    fun stopAlarm() {
        mediaPlayer?.apply {
            if (isPlaying) stop()
            release()
        }
        mediaPlayer = null
    }
}

关键细节说明

  • 替代废弃API:不要使用已淘汰的setAudioStreamType(AudioManager.STREAM_ALARM),改用AudioAttributes指定USAGE_ALARM,系统会自动关联闹钟音量通道,不受媒体音量调整影响。
  • 资源管理:每次播放前必须释放旧的MediaPlayer实例,停止播放时务必调用release(),否则会占用音频资源导致其他应用无法正常发声。
  • 权限适配:如果在后台服务中播放闹钟,Android 12+需要申请POST_NOTIFICATIONS权限,且服务需启动为前台服务;Android 13+使用自定义本地铃声时,需申请读取外部存储权限。
  • 异常捕获:prepare()和start()可能抛出IO异常或非法状态异常,必须捕获处理,避免应用崩溃。

调用示例

在Activity或Service中使用:

// 初始化播放器
val alarmPlayer = AlarmMediaPlayer(this)

// 播放res/raw目录下的闹钟铃声(示例:R.raw.alarm_tone)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    alarmPlayer.playAlarmSound(R.raw.alarm_tone)
}

// 停止播放时调用
// alarmPlayer.stopAlarm()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:06:30