feat: media session source and media card
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
package top.yeij.hearth.media
|
||||
|
||||
import android.content.Context
|
||||
import android.media.MediaMetadata
|
||||
import android.media.session.MediaController
|
||||
import android.media.session.MediaSessionManager
|
||||
import android.media.session.PlaybackState
|
||||
import android.util.Log
|
||||
|
||||
// 监听系统活跃媒体会话,取第一个 controller 的 metadata + playbackState 构造 MediaInfo 回调
|
||||
// Watch active media sessions; build MediaInfo from the first controller's metadata + playbackState
|
||||
class MediaSessionSource(context: Context) {
|
||||
private val msm = context.getSystemService(Context.MEDIA_SESSION_SERVICE) as MediaSessionManager
|
||||
private var listener: ((MediaInfo?) -> Unit)? = null
|
||||
|
||||
fun start(cb: (MediaInfo?) -> Unit) {
|
||||
listener = cb
|
||||
msm.addOnActiveSessionsChangedListener({ controllers ->
|
||||
val c = controllers?.firstOrNull()
|
||||
if (c == null) {
|
||||
Log.d("HearthMedia", "no active media session")
|
||||
cb(null)
|
||||
return@addOnActiveSessionsChangedListener
|
||||
}
|
||||
val meta = c.metadata
|
||||
val state = c.playbackState
|
||||
cb(
|
||||
MediaInfo(
|
||||
meta?.getString(MediaMetadata.METADATA_KEY_TITLE) ?: "",
|
||||
meta?.getString(MediaMetadata.METADATA_KEY_ARTIST) ?: "",
|
||||
meta?.getString(MediaMetadata.METADATA_KEY_ALBUM) ?: "",
|
||||
state?.state == PlaybackState.STATE_PLAYING,
|
||||
state?.position ?: 0L,
|
||||
meta?.getLong(MediaMetadata.METADATA_KEY_DURATION) ?: 0L,
|
||||
c.packageName,
|
||||
)
|
||||
)
|
||||
Log.d("HearthMedia", "media: ${c.packageName}")
|
||||
}, null)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user