You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备媒体播放启动时是否有系统广播可供监听?

Android监听媒体播放开始事件(无需轮询/音频焦点)
  • 核心方案:使用MediaSessionManager监听活跃媒体会话
    Android 5.0(API Level 21)及以上提供了MediaSessionManager,可以被动监听系统中活跃的媒体会话状态,既不需要持续轮询isMusicActive(),也无需请求音频焦点。

  • 实现步骤

  1. 获取MediaSessionManager实例
    通过系统服务获取MediaSessionManager对象,用于管理媒体会话监听。
  2. 注册活跃会话监听器
    实现OnActiveSessionsChangedListener,监听系统中活跃媒体会话的新增或移除。
  3. 监听单个会话的播放状态
    对每个活跃的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:05:06