以供自己或他人日后参考,MediaPlayer本质上就像立体声播放器的内部机制,直接“内部”控制声音的播放。你确实有函数,比如 play()、pause()、skipToNext() 等。
当你想创建一个音乐应用程序时,你通常会实现一个客户端服务模型,应用程序接口是你的客户端(在主 UI 线程中),服务将播放音乐(也在后台)。Google 所做的是实现了一个专门针对音乐和视频的客户端服务模型MediaSession(Compat)。它有自己的服务类型,会话状态(当你想要通知时,Android Wear 或 Auto,让他们知道应用程序是在播放还是暂停,可以获取曲目信息和专辑图片等,以便一切顺利在所有这些平台上同步),以及需要为不同功能实现的MediaController及其回调。
它的一个选项是getTransportControls(),它本质上是当您按下前面提到的立体声播放器上的 play()、pause() 等按钮时发生的情况的高级表示。对于这些中的每一个,您 @Override 它们各自的 onPlay()、onPause() 回调方法,以在控制您的音乐的MediaPlayer对象上执行您想要的确切功能。在这里,您可以调用 MediaPlayer.play() 函数,以及设置 MediaSession 的播放状态,可能更新通知等。
至于其他,音量键确实是音量键,而媒体按钮确实是您可能拥有的物理按钮(蓝牙耳机、带播放按钮的耳机等),您可以设置您的应用程序以便它识别和使用他们。
对于有兴趣更好地看到这一点的人,下面是我的应用程序项目的回购。虽然远非一个功能齐全、没有错误的应用程序,但它确实实现了 MediaSession 和服务,以及非常完美的通知和 MediaButton 控件。
https://github.com/RockBoyEmy/GESMediaPlayer
还要感谢@pantos27 的帮助