package com.sinata.xqmuse
|
|
import android.app.NotificationChannel
|
import android.app.NotificationManager
|
import android.app.Service
|
import android.content.Intent
|
import android.media.AudioManager
|
import android.media.MediaPlayer
|
import android.os.Build
|
import android.os.IBinder
|
import android.os.PowerManager
|
import androidx.core.app.NotificationCompat
|
|
class ThinkAudioService:Service() {
|
private var mediaPlayer: MediaPlayer? = null
|
private var wakeLock: PowerManager.WakeLock? = null
|
|
override fun onCreate() {
|
super.onCreate()
|
// 初始化 MediaPlayer
|
// mediaPlayer = MediaPlayer.create(this, R.raw.audio_sample)
|
mediaPlayer!!.isLooping = true
|
|
// 初始化 WakeLock
|
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
wakeLock = powerManager.newWakeLock(
|
PowerManager.PARTIAL_WAKE_LOCK,
|
"AudioService::WakeLock"
|
)
|
}
|
|
private val focusChangeListener =
|
AudioManager.OnAudioFocusChangeListener { focusChange ->
|
if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
|
mediaPlayer!!.pause() // 焦点丢失时暂停播放
|
}
|
}
|
|
private fun createNotificationChannel() {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
val channel = NotificationChannel(
|
"audio_channel",
|
"音频播放",
|
NotificationManager.IMPORTANCE_LOW
|
)
|
getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
|
}
|
}
|
|
override fun onBind(intent: Intent?): IBinder? {
|
return null
|
}
|
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
// 创建通知渠道(Android 8.0+ 必须)
|
createNotificationChannel()
|
|
// 启动前台服务
|
val notification = NotificationCompat.Builder(this, "audio_channel")
|
.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
|
}
|
return START_STICKY
|
}
|
|
override fun onDestroy() {
|
if (mediaPlayer != null) {
|
mediaPlayer!!.release()
|
mediaPlayer = null
|
}
|
if (wakeLock != null && wakeLock!!.isHeld) {
|
wakeLock!!.release()
|
}
|
super.onDestroy()
|
}
|
}
|