小米妙播适配说明更新时间: 2025-03-13 10:17:00

一、小米妙播背景与介绍

1、安卓原生Media Session介绍

Android 框架定义了两个类(媒体会话和媒体控制器),它们为构建媒体播放器应用提供了一个完善的结构。

媒体会话和媒体控制器通过以下方式相互通信:使用与标准播放器操作(播放、暂停、停止等)相对应的预定义回调,以及用于定义应用独有的特殊行为的可扩展自定义调用。

更多信息请点击

2、小米妙播介绍

小米妙播支持基于Media Session的音频播控、基于Wi-Fi的跨设备音乐接力。

用户可以在小米手机和平板的系统控制中心、通知栏/锁屏媒体中心使用该功能。


控制中心内的小米妙播播控,基于安卓原生Media Session能力实现,音频应用适配Media Session即可,众多知名三方应用均已适配。

二、适配小米妙播的好处

1、系统全局常驻播控

小米妙播作为控制中心常驻的播控、互联入口,用户可以在手机全局操作音频,是Android厂商中全面媲美苹果 AirPlay2 的系统级功能。

2、覆盖更多场景的播放

各音频app的用户活跃场景不再局限于手机,用户用音箱等设备听歌时,也可使用各音频app,通过小米妙播互联播放。

三、适配方式

基本适配方式请参考谷歌官方文档:使用媒体会话构建媒体浏览器服务

适配要点:

  • 及时更新Meta信息
// 构建MediaSession

MediaSessionCompat mMediaSession;



//构建MediaMetadata,并传入媒体meta信息(歌曲名、专辑名、歌手名、歌曲时长等)

MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();

builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, getTrackName())

.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, getAlbumName())

.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, getArtistName())

.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration());

MediaMetadataCompat metadata = builder.build();

mMediaSession.setMetadata(metadata);



// 构建并传入歌曲封面

Bitmap result;

// 获取封面BitMap...

builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, result);

mMediaSession.setMetadata(builder.build());
  • 及时更新播放状态信息
// 构建PlaybackState,传入播放状态、播放进度等信息。

PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder(getSourcePlaybackState())

.setBufferedPosition(getBufferedPosition())

.setState(PlaybackStateCompat.STATE_PLAYING, position(), getSpeedRatio());

mMediaSession.setPlaybackState(builder.build());

  • 处理播放回调 
// 构建MediaSessionCompat.Callback回调,处理播放、暂停、上一首、下一首、调整播放进度等操作

private class MediaPlaybackSessionCallback extends MediaSessionCompat.Callback {

@Override

public void onPlay() {

play();

}



@Override

public void onPause() {

pause();

}



@Override

public void onSkipToNext() {

next();

}



@Override

public void onSkipToPrevious() {

prev();

}



@Override

public void onFastForward() {

forward();

}



@Override

public void onRewind() {

backward();

}



@Override

public void onStop() {

stop();

}



@Override

public void onSeekTo(long pos) {

seek(pos);

}

}



mMediaSession.setCallback(new MediaPlaybackSessionCallback());