MediaSession的简单使用

本文介绍了MediaSession在Android中的应用,它允许对媒体应用进行无需应用本身的控制,提供流畅体验,包括通过通知栏操作和简单的API接口。展示了如何在客户端和服务端使用MediaSession进行媒体控制。

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

MediaSession是一个媒体控制类,通过与媒体应用的交互,可以实现对媒体应用的控制。

现在广泛应用到对媒体控制的场景,例如耳机,蓝牙设备,VR等。

MediaSession的好处

可以通过MediaSession就可以对media应用进行控制,无需打开应用本身。也是aosp中支持的媒体应用的控制与管理框架,无需单独适配各种控制场景。从而提供了流畅的用户体验。

与通知栏配合使用,可以在通知栏实时看到当前播放的媒体信息,并且可以在通知栏中进行对媒体操作,播放、暂停、上一曲、下一曲等。方便用户操作,无需每次都打开应用。

总之MediaSession可以提供完美的用户体验。

MediaSession的简单使用

使用的类说明

MediaBrowser:媒体浏览器。连接服务,并获取token。

MediaController:媒体控制类。可以获取媒体信息,对媒体应用发送控制指令

MediaBrowserService:浏览器服务,实现具体的媒体控制逻辑。

MediaSession:接收客户端指令,并将媒体信息发送到客户端。

上代码!!!

客户端:
class MainActivity : AppCompatActivity() {

    private lateinit var mMediaBrowser: MediaBrowser
    private lateinit var mMediaController: MediaController

    private var mMediaCallback = object : MediaController.Callback() {
        override fun onMetadataChanged(metadata: MediaMetadata?) {
            super.onMetadataChanged(metadata)
            var description = metadata?.description
            var title = description?.title
            var author = description?.subtitle
            var album = description?.description
            var totalTime = metadata?.getLong(MediaMetadata.METADATA_KEY_DURATION)
            ...
        }

        override fun onPlaybackStateChanged(state: PlaybackState?) {
            super.onPlaybackStateChanged(state)
            var playState = state?.state
            when (playState) {
                PlaybackState.STATE_PLAYING -> {

                }
            }
            //当前播放位置
            var position = state?.position
        }

        override fun onSessionEvent(event: String, extras: Bundle?) {
            super.onSessionEvent(event, extras)
        }

        override fun onAudioInfoChanged(info: MediaController.PlaybackInfo?) {
            super.onAudioInfoChanged(info)
        }
    }

    private var mConnectionCallback = object : MediaBrowser.ConnectionCallback() {
        override fun onConnected() {
            super.onConnected()
            var token = mMediaBrowser.sessionToken;
            mMediaController = MediaController(applicationContext, token)
            mMediaController.registerCallback(mMediaCallback)
//            mMediaController.unregisterCallback(mMediaCallback)
        }

        override fun onConnectionSuspended() {
            super.onConnectionSuspended()
        }

        override fun onConnectionFailed() {
            super.onConnectionFailed()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mMediaBrowser = MediaBrowser(
            this, ComponentName(this, TargetService::class.java),
            mConnectionCallback, null
        )
        mMediaBrowser.connect()
        ...
        mMediaController.transportControls.play()
        var bundle = Bundle()
        bundle.putString("play", "yes")
        mMediaController.transportControls.sendCustomAction("", bundle)
        val metadata = mMediaController.metadata
        val playbackState = mMediaController.playbackState
        ...

    }


}
服务端:
class TargetService : MediaBrowserService() {

    private lateinit var mMediaSession:MediaSession

    private var mCallback = object : MediaSession.Callback() {
        override fun onPlay() {
            super.onPlay()
            ...
            mMediaSession.setPlaybackState(playbackState)
        }

        override fun onPause() {
            super.onPause()
            ...
        }

        override fun onSeekTo(pos: Long) {
            super.onSeekTo(pos)
            ...
        }

        override fun onSkipToNext() {
            super.onSkipToNext()
            ...
        }

        override fun onCustomAction(action: String, extras: Bundle?) {
            super.onCustomAction(action, extras)
            ...
        }


    }

    override fun onCreate() {
        super.onCreate()
        mMediaSession = MediaSession(this,"TargetService")
        sessionToken = mMediaSession.sessionToken
        mMediaSession.setCallback(mCallback)
    }

    override fun onGetRoot(clientPackageName: String, clientUid: Int, rootHints: Bundle?): BrowserRoot? {
        ...
        return BrowserRoot("rootId", null)
    }

    override fun onLoadChildren(parentId: String, result: Result<MutableList<MediaBrowser.MediaItem>>) {
        ...
        TODO("Not yet implemented")
    }
}

就此,大功告成,快去试试吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值