UPDATE:
评论澄清说,问题实际上是关于查看/控制其他应用程序的 MediaSession,而不是您自己的。
尽管无法直接执行此操作,但由于隐私原因,您有两种选择,具有不同级别的可用控制/信息以及不同的用户交互要求:
如果您只想跳过音乐或播放/暂停,您可以发送媒体按钮事件(通过音频管理器)和/或请求/释放音频焦点.
如果您还需要了解当前正在播放的内容的元数据,则有一种更具侵入性的方法,需要显式的用户交互:
首先,创建并注册一个NotificationListenerService:
public class NotificationListener extends NotificationListenerService {
public NotificationListener() {
}
}
在AndroidManifest.xml中:
<service android:name=".NotificationListener"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
然后,您将能够通过在 getActiveSessions 调用中指定您的NotificationListenerService componentName 来获取MediaSessions:
MediaSessionManager mm = (MediaSessionManager) this.getSystemService(
Context.MEDIA_SESSION_SERVICE);
List<MediaController> controllers = mm.getActiveSessions(
new ComponentName(this, NotificationListener.class));
Log.i(TAG, "found " + controllers.size() + " controllers");
需要注意的是,用户需要明确授予您的应用程序通知访问权限,方法是转到“设置”->“声音和通知”->“通知访问”
原始回复:
描述 MediaSession 并可以传递以允许其他组件/应用程序控制现有 MediaSession 的对象是 MediaSession.Token。使用令牌,您可以直接创建 MediaController,而无需借助 MediaSessionManager。其代码类似于:
MediaController mediaController = new MediaController(getActivity(),
sessionToken);
这不需要任何特殊许可。如果您还使用 MediaBrowser 或 MediaBrowserService,则应使用其 getSessionToken() 方法获取与 MediaBrowser 关联的令牌。
我们刚刚发布了一个例子它使用 MediaBrowserService 来处理音乐浏览、播放和媒体样式通知,并提供一个简单的 Activity 来控制播放。