【问题标题】:Control another app's audio playback控制另一个应用程序的音频播放
【发布时间】:2018-10-15 20:28:51
【问题描述】:

我正在尝试编写应用程序来控制另一个应用程序的音频播放。

例如:我在 google play 中听音乐,我的应用程序可以截取对此音频流的控制。我不知道它是带有通知的小部件还是前台服务,但我找不到如何检查系统中是否正在播放音乐以及如何访问控制它的信息。

我找到了MediaSessionMediaBrowserService 等等。但它是在一个应用程序内部实现的,它创建了播放音乐背景的服务,并将客户端部分创建为 i UI 部分,并获得对 Auto、Google Assistant 等的访问权限。但我只想写客户端部分,获取有关当前播放音乐的信息并编写一些小部件来自己控制它

我可以用 Google 搜索什么来找到解决方案?

【问题讨论】:

  • 应用不需要允许您控制这些应用的音频播放。
  • @CommonsWare 好的,但是 Microsoft Next Lock Screen 可以很好地控制我的音乐播放
  • 在游戏市场上也有一些可以处理来自另一个应用程序的播放的应用程序。我只是想学习android的这一部分,这对我来说是很酷的项目和经验
  • 我怀疑你没有测试过每一个Android应用的音频播放,看看其他应用是否可以控制它。

标签: android audio listener


【解决方案1】:

Service extends NotificationListenerService解决

使用内部服务MediaSessionManagerMediaController

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));
        }
    }
}

【讨论】:

  • 我也遇到了同样的问题,你能分享一下你的解决方案吗?
  • 这需要系统权限MEDIA_CONTENT_CONTROLsee link
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多