控制另一个应用程序的音频播放
Control another app's audio playback
我正在尝试编写应用程序来控制来自另一个应用程序的音频播放。
例如:我在 google 播放中听音乐,我的应用程序可以拦截对该音频流的控制。我不知道它是带有通知的小部件还是前台服务,但我找不到有关如何检查系统中是否正在播放音乐以及如何访问控制它的信息。
我找到了MediaSession
、MediaBrowserService
等等。但它是关于在一个应用程序内部实现的,它创建服务来播放音乐背景并创建客户端部分作为我 UI 部分并获得对自动、Google 助手等的访问权限。但我只想写客户端部分,获取有关当前播放音乐的信息并编写一些小部件来自己控制它
我可以google找到解决方案吗?
已解决 Service extends NotificationListenerService
服务内部使用了 MediaSessionManager
和 MediaController
MediaSessionManager mediaSessionManager;
ComponentName componentName;
MediaController controller;
MediaSessionManager.OnActiveSessionsChangedListener sessionsChangedListener = new MediaSessionManager.OnActiveSessionsChangedListener() {
@Override
public void onActiveSessionsChanged(@Nullable List<MediaController> controllers) {
Log.d(TAG, "onActiveSessionsChanged: session is changed");
for (MediaController controller : controllers) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.d(TAG, "onActiveSessionsChanged: controller = " + controller.getPackageName());
MediaMetadata meta = controller.getMetadata();
Log.d(TAG, "onCreate: artist = " + meta.getString(MediaMetadata.METADATA_KEY_ARTIST));
Log.d(TAG, "onCreate: song = " + meta.getString(MediaMetadata.METADATA_KEY_TITLE));
}
}
}
};
@Override
public void onCreate() {
super.onCreate();
componentName = new ComponentName(this, TestMediaService.class);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
mediaSessionManager.addOnActiveSessionsChangedListener(sessionsChangedListener, componentName);
List<MediaController> controllers = mediaSessionManager.getActiveSessions(componentName);
Log.d(TAG, "onCreate listener: controllers size = " + controllers.size());
for (MediaController mediaController : controllers) {
controller = mediaController;
Log.d(TAG, "onCreate: controller = " + controller.getPackageName());
MediaMetadata meta = controller.getMetadata();
Log.d(TAG, "onCreate: artist = " + meta.getString(MediaMetadata.METADATA_KEY_ARTIST));
Log.d(TAG, "onCreate: song = " + meta.getString(MediaMetadata.METADATA_KEY_TITLE));
}
}
}
我正在尝试编写应用程序来控制来自另一个应用程序的音频播放。
例如:我在 google 播放中听音乐,我的应用程序可以拦截对该音频流的控制。我不知道它是带有通知的小部件还是前台服务,但我找不到有关如何检查系统中是否正在播放音乐以及如何访问控制它的信息。
我找到了MediaSession
、MediaBrowserService
等等。但它是关于在一个应用程序内部实现的,它创建服务来播放音乐背景并创建客户端部分作为我 UI 部分并获得对自动、Google 助手等的访问权限。但我只想写客户端部分,获取有关当前播放音乐的信息并编写一些小部件来自己控制它
我可以google找到解决方案吗?
已解决 Service extends NotificationListenerService
服务内部使用了 MediaSessionManager
和 MediaController
MediaSessionManager mediaSessionManager;
ComponentName componentName;
MediaController controller;
MediaSessionManager.OnActiveSessionsChangedListener sessionsChangedListener = new MediaSessionManager.OnActiveSessionsChangedListener() {
@Override
public void onActiveSessionsChanged(@Nullable List<MediaController> controllers) {
Log.d(TAG, "onActiveSessionsChanged: session is changed");
for (MediaController controller : controllers) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.d(TAG, "onActiveSessionsChanged: controller = " + controller.getPackageName());
MediaMetadata meta = controller.getMetadata();
Log.d(TAG, "onCreate: artist = " + meta.getString(MediaMetadata.METADATA_KEY_ARTIST));
Log.d(TAG, "onCreate: song = " + meta.getString(MediaMetadata.METADATA_KEY_TITLE));
}
}
}
};
@Override
public void onCreate() {
super.onCreate();
componentName = new ComponentName(this, TestMediaService.class);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
mediaSessionManager.addOnActiveSessionsChangedListener(sessionsChangedListener, componentName);
List<MediaController> controllers = mediaSessionManager.getActiveSessions(componentName);
Log.d(TAG, "onCreate listener: controllers size = " + controllers.size());
for (MediaController mediaController : controllers) {
controller = mediaController;
Log.d(TAG, "onCreate: controller = " + controller.getPackageName());
MediaMetadata meta = controller.getMetadata();
Log.d(TAG, "onCreate: artist = " + meta.getString(MediaMetadata.METADATA_KEY_ARTIST));
Log.d(TAG, "onCreate: song = " + meta.getString(MediaMetadata.METADATA_KEY_TITLE));
}
}
}