Android MediaSession架构分析

本文详细介绍了Android5.0中新引入的MediaSession概念及其架构。MediaSession为播放器与控制器之间的交互提供了新的机制,取代了RemoteControlClient,使控制端能够更灵活地管理和控制播放器状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android5.0 提出了全新的MediaSession概念用于播放器与控制器之间进行交互,它取代之前的RemoteControlClient,并提供了更为灵活的客户端受控端模型,下面是它的架构图:



 其架构主要分为3大部分:

1. 受控端(播放器):

播放器需要创建MediaSession,创建的时候就类似于在系统注册了它,并告诉系统它可以被其他控制端所控制。

2. framework(中介):

受控端创建MediaSession以后都会登记在framework中,framework同时会记录所有的MediaSession,并向控制端提供查询及状态更新服务。

3.控制端(播放状态显示及控制):

控制端实现方式可以多种多样,可以在另外一个app里实现,也可以在系统ui里实现,它主要通过framework的MediaSessionManager来查询系统中的session并根据自己的需要来选择要控制的session,并能要求系统在session发生变化的时候通知自己。


实现方式:

1. 受控端(播放器):

受控端主要需要实现媒体的播放,这个和之前的没有区别,其次需要创建MediaSession,创建的时候需要设置唯一的session标识符,这样控制端可以根据该标识符来确定控制的session。然后需要实现的是session的回调方法(SessionCallback),该回调方法中定义了媒体播放的常见操作,play、pause、next、previous等,在创建session时需要把该callback设置到session中,并实现收到回调的处理办法,比如onPlay的时候就启动本地的播放器进行播放,onPause的时候就暂停。同时需要把播放器的状态通过session设置到控制端,MediaSession提供专门的方法setPlaybackState和setMetadata来更新本地播放器的状态和信息到控制端。


2. 控制端:

控制端需要先通过系统服务取得MediaSessionManager,然后查询系统中的Session,并根据自己的需求确定要控制的session实例,比如根据标识符或者包名来确认。取得session以后需要完成两件事,一是取得该session的MediaControl,该control用于控制播放器执行具体的操作,比如调用MediaControl的play方法将最终由系统执行播放器的callback里的onPlay;二是需要向该session注册自己的callback,该callback在播放器状态发生变化时会被调用以通知控制端播放器的状态及数据(媒体名、进度等等)。


3. 一个简单的受控端与控制端示例:

(待续)


原文链接:https://blog.youkuaiyun.com/belyxiong/article/details/42039665

### 使用 MediaSession 框架与 ViewModel 的 Android Java 集成 在 Android 开发中,`MediaSession` 是用于管理媒体播放的核心组件之一。它允许应用程序控制音频焦点、处理远程控件以及与其他应用共享媒体状态。而 `ViewModel` 则是一种架构组件,旨在存储和管理界面相关的数据,以便在配置更改(如屏幕旋转)时保持数据一致。 以下是关于如何将 `MediaSession` 和 `ViewModel` 结合使用的具体实现方法: #### 1. 创建 MediaSession 实例 通过创建一个 `MediaSessionCompat` 对象来初始化会话实例,并将其设置到 `MediaPlayer` 或其他媒体控制器上[^2]。 ```java import android.media.session.MediaSessionCompat; import androidx.lifecycle.ViewModel; public class MediaPlayerViewModel extends ViewModel { private final MediaSessionCompat mediaSession; public MediaPlayerViewModel() { this.mediaSession = new MediaSessionCompat(/* context */, /* tag */); // 设置回调函数以响应外部事件 mediaSession.setCallback(new MediaSessionCompat.Callback() { @Override public void onPlay() { super.onPlay(); // 处理播放逻辑 } @Override public void onPause() { super.onPause(); // 处理暂停逻辑 } @Override public boolean onMediaButtonEvent(Intent mediaButtonIntent) { // 响应媒体按钮点击事件 return super.onMediaButtonEvent(mediaButtonIntent); } }); // 启动会话并使其可发现 mediaSession.setActive(true); } public MediaSessionCompat getMediaSession() { return mediaSession; } } ``` #### 2. 将 MediaSession 绑定至 Activity 或 Fragment 为了使视图层能够访问 `MediaSession` 数据,在绑定过程中可以利用 `LiveData` 来观察变化[^3]。 ```java import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; public class MainActivity extends AppCompatActivity { private MediaPlayerViewModel mediaPlayerViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化 ViewModel mediaPlayerViewModel = new ViewModelProvider(this).get(MediaPlayerViewModel.class); // 订阅 LiveData 更新 mediaPlayerViewModel.getPlaybackState().observe(this, new Observer<Integer>() { @Override public void onChanged(Integer playbackState) { switch (playbackState) { case PlaybackStateCompat.STATE_PLAYING: updateUIForPlaying(); break; case PlaybackStateCompat.STATE_PAUSED: updateUIForPaused(); break; default: resetUI(); break; } } }); // 获取 MediaSession 并关联操作 MediaSessionCompat session = mediaPlayerViewModel.getMediaSession(); setMediaController(session); } private void setMediaController(MediaSessionCompat session) { MediaControllerCompat controller = new MediaControllerCompat(this, session); MediaControllerCompat.setMediaController(this, controller); } } ``` #### 3. 控制器交互设计 当用户触发某些动作时(例如按下播放/暂停键),可以通过调用 `MediaControllerCompat.TransportControls` 方法发送命令给后台服务或当前活动中的播放器[^4]。 ```java // 调用 Transport Controls 执行特定功能 mediaController.getTransportControls().play(); mediaController.getTransportControls().pause(); mediaController.getTransportControls().skipToNext(); mediaController.getTransportControls().rewind(); ``` 以上代码展示了如何在一个典型的 Android 应用程序中集成 `MediaSession` 和 `ViewModel` 构件。这种模式不仅提高了代码模块化程度,还增强了用户体验的一致性和可靠性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值