Android设备媒体播放启动时是否有系统广播可供监听?
Android监听媒体播放开始事件(无需轮询/音频焦点)
核心方案:使用MediaSessionManager监听活跃媒体会话
Android 5.0(API Level 21)及以上提供了MediaSessionManager,可以被动监听系统中活跃的媒体会话状态,既不需要持续轮询isMusicActive(),也无需请求音频焦点。实现步骤
- 获取MediaSessionManager实例
通过系统服务获取MediaSessionManager对象,用于管理媒体会话监听。 - 注册活跃会话监听器
实现OnActiveSessionsChangedListener,监听系统中活跃媒体会话的新增或移除。 - 监听单个会话的播放状态
对每个活跃的MediaSession,注册OnPlaybackStateChangedListener,当会话播放状态变为STATE_PLAYING时,即可触发通知逻辑。
- 代码示例
import android.content.Context import android.media.session.MediaSession import android.media.session.MediaSessionManager import android.media.session.PlaybackState import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class MediaPlayMonitorActivity : AppCompatActivity() { private lateinit var mediaSessionManager: MediaSessionManager private val activeSessionsListener = MediaSessionManager.OnActiveSessionsChangedListener { sessions -> sessions.forEach { session -> session.addOnPlaybackStateChangedListener(playbackStateListener) } } private val playbackStateListener = MediaSession.OnPlaybackStateChangedListener { state -> state?.takeIf { it.state == PlaybackState.STATE_PLAYING }?.run { // 媒体开始播放,在此处理通知逻辑 // 例:发送本地广播、弹出应用内通知等 } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mediaSessionManager = getSystemService(Context.MEDIA_SESSION_SERVICE) as MediaSessionManager } override fun onResume() { super.onResume() // 注册监听器,传null表示监听所有媒体会话 mediaSessionManager.addOnActiveSessionsChangedListener(activeSessionsListener, null) } override fun onPause() { super.onPause() mediaSessionManager.removeOnActiveSessionsChangedListener(activeSessionsListener) // 移除所有会话的状态监听器,避免内存泄漏 mediaSessionManager.activeSessions.forEach { session -> session.removeOnPlaybackStateChangedListener(playbackStateListener) } } }
权限说明
系统应用或持有
android.permission.MEDIA_CONTENT_CONTROL权限的应用,可直接监听所有活跃媒体会话。普通应用在Android 10(API 29)及以上,需引导用户开启通知访问权限(跳转路径:
Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS),否则无法获取完整的媒体会话状态。注意事项
需区分
STATE_PLAYING和STATE_BUFFERING状态,仅当状态为STATE_PLAYING时,确认媒体实际开始播放。务必在生命周期销毁/暂停阶段移除所有监听器,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Flyview
相关产品推荐
相关产品推荐

