From 449bdb5d2b5bf7b272ca5cda4c066f9a65040064 Mon Sep 17 00:00:00 2001 From: lmw <125975490@qq.com> Date: 星期二, 04 三月 2025 14:30:40 +0800 Subject: [PATCH] fix --- app/src/main/java/com/sinata/xqmuse/ThinkAudioService.kt | 126 +++++++++++++++++++++++++++++++++++------- 1 files changed, 105 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/sinata/xqmuse/ThinkAudioService.kt b/app/src/main/java/com/sinata/xqmuse/ThinkAudioService.kt index a6d8f87..63acd19 100644 --- a/app/src/main/java/com/sinata/xqmuse/ThinkAudioService.kt +++ b/app/src/main/java/com/sinata/xqmuse/ThinkAudioService.kt @@ -9,17 +9,32 @@ import android.os.Build import android.os.IBinder import android.os.PowerManager +import android.util.Log import androidx.core.app.NotificationCompat +import cn.sinata.xldutils.utils.SPUtils +import com.sinata.xqmuse.network.entity.VoiceDetail +import com.sinata.xqmuse.utils.AudioUtils +import com.sinata.xqmuse.utils.Const +import com.sinata.xqmuse.utils.event.EmptyEvent +import com.sinata.xqmuse.utils.event.IntEvent +import kotlinx.android.synthetic.main.activity_main.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe -class ThinkAudioService:Service() { - private var mediaPlayer: MediaPlayer? = null +class ThinkAudioService:Service(), AudioUtils.OnAudioStatusUpdateListener { + private var thinkBgPlayer: AudioUtils? = null//冥想背景音播放器 private var wakeLock: PowerManager.WakeLock? = null + private val TAG = "ThinkAudioService" override fun onCreate() { super.onCreate() + EventBus.getDefault().register(this) + Log.e(TAG,"ThinkAudioService初始化") // 初始化 MediaPlayer -// mediaPlayer = MediaPlayer.create(this, R.raw.audio_sample) - mediaPlayer!!.isLooping = true + if (thinkBgPlayer == null){ + thinkBgPlayer = AudioUtils() + thinkBgPlayer!!.setOnAudioStatusUpdateListener(this) + } // 初始化 WakeLock val powerManager = getSystemService(POWER_SERVICE) as PowerManager @@ -32,7 +47,7 @@ private val focusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange -> if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { - mediaPlayer!!.pause() // 焦点丢失时暂停播放 + thinkBgPlayer?.pause() // 焦点丢失时暂停播放 } } @@ -57,33 +72,102 @@ // 启动前台服务 val notification = NotificationCompat.Builder(this, "audio_channel") - .setContentTitle("音频播放中") + .setContentTitle("正在疗愈") .setSmallIcon(R.mipmap.ic_launcher) .build() startForeground(1, notification) - // 请求音频焦点 - val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager - val result = audioManager.requestAudioFocus( - focusChangeListener, - AudioManager.STREAM_MUSIC, - AudioManager.AUDIOFOCUS_GAIN - ) - if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { - mediaPlayer?.start() - wakeLock?.acquire(30 * 60 * 1000L) // 申请 WakeLock - } + // 请求音频焦点 todo 请求焦点会导致首页水波纹视频暂停 +// val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager +// val result = audioManager.requestAudioFocus( +// focusChangeListener, +// AudioManager.STREAM_MUSIC, +// AudioManager.AUDIOFOCUS_GAIN +// ) +// if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + val volume = SPUtils.instance().getInt(Const.User.VOLUME_THINK, 50) + thinkBgPlayer?.setVolume(volume.toFloat() / 100) + thinkBgPlayer?.startPlayMusic(this, voice?.meditationMusicList?.get(index)) + wakeLock?.acquire(60 * 60 * 1000L) // 申请 WakeLock +// } return START_STICKY } - override fun onDestroy() { - if (mediaPlayer != null) { - mediaPlayer!!.release() - mediaPlayer = null + @Subscribe + fun onAudioEvent(e: EmptyEvent){ + when(e.code){ + Const.EventCode.SERVICE_AUDIO_PAUSE->{ + thinkBgPlayer?.pause() + } + Const.EventCode.SERVICE_AUDIO_RESUME->{ + thinkBgPlayer?.resume() + } + Const.EventCode.CHANGE_THINK_VOLUME->{ + val v = SPUtils.instance().getInt(Const.User.VOLUME_THINK, 50) + thinkBgPlayer?.setVolume(v.toFloat() / 100) + } + Const.EventCode.SERVICE_AUDIO_PROGRESS->{ + currentPosition = thinkBgPlayer?.currentPosition ?: 0 + EventBus.getDefault().post(EmptyEvent(Const.EventCode.GOT_THINK_POSITION)) + } } + } + + @Subscribe + fun onIntEvent(e: IntEvent){ + if (e.code == Const.EventCode.SERVICE_AUDIO_SEEK){ + thinkBgPlayer?.seekTo(e.i) + } + } + + override fun onDestroy() { + EventBus.getDefault().unregister(this) + thinkBgPlayer?.stopPlayMusic(false) if (wakeLock != null && wakeLock!!.isHeld) { wakeLock!!.release() } super.onDestroy() } + + override fun onUpdate(db: Double, time: Long) { + + } + + override fun onStop(filePath: String?) { + } + + override fun onStartPlay() { + } + + override fun onFinishPlay() { + if (voice == null) //说明是手动关闭的,不需要处理下一步播放逻辑 + return + if (isRecycle){ //单曲 + if (playing) + thinkBgPlayer?.startPlayMusic(this, voice?.meditationMusicList?.get(index)) + }else{//顺序 + index++ + if (index>=voice?.meditationMusicList?.size?:0)//列表已播完 + EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK)) + else{ + currentDuration = voice?.meditationSecondList?.get(index)?:0 + EventBus.getDefault().post(EmptyEvent(Const.EventCode.GOT_THINK_DURATION)) + if (playing) + thinkBgPlayer?.startPlayMusic(this, voice?.meditationMusicList?.get(index)) + } + } + } + + override fun onGetDuration(duration: Int) { + } + + companion object{ //冥想播放相关参数 + var playing = false //true播放中 + var isRecycle = false //true单曲循环播放 + var voice: VoiceDetail? = null //冥想详情 + var index = 0 //当前播放序号 + var currentDuration = 0 //当前音频长度(秒) + var currentPosition = 0L //当前音频进度(毫秒) + var finishTime = 0L //自动结束的时间戳 + } } \ No newline at end of file -- Gitblit v1.7.1