如何在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
相关产品推荐
相关产品推荐

