如何在自定义Android应用中控制YouTube Music并获取播放曲目信息?
我完全懂你的困扰!YouTube Music官方没有开放直接的控制API,再加上Android媒体框架(比如Media3)的多次迭代,确实让人摸不着头绪。结合你尝试的两种方案,我来给你梳理下可行的路径和遇到的问题:
一、用广播Intent实现基础控制(快速可用)
你找到的这个方法确实能实现基础的播放/暂停/切歌操作,不需要复杂的权限,代码也很轻量:
// 例如下一曲操作 Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); intent.setPackage("com.google.android.apps.youtube.music"); intent.setAction("com.google.android.youtube.music.pendingintent.controller_widget_next"); sendBroadcast(intent);
对应的其他操作Action大概是这些:
com.google.android.youtube.music.pendingintent.controller_widget_play_pause:播放/暂停切换com.google.android.youtube.music.pendingintent.controller_widget_previous:上一曲
不过这个方案的硬伤就是无法获取当前播放的曲目信息,只能单向发送控制指令。
二、Media3 MediaController方案(权限限制导致失败)
你尝试通过SessionToken获取MediaController的思路是对的,但失败的核心原因是:YouTube Music的MediaBrowserService做了权限限制,不允许第三方应用随意连接。
从你遇到的SecurityException和onConnectFailed错误就能看出来,官方并没有开放这个服务的访问权限,所以这条路目前是走不通的——哪怕你拿到了SessionToken,也无法建立有效的连接来获取播放状态或曲目信息。
三、获取播放曲目信息的替代方案
如果想要拿到当前播放的曲目信息,有两个相对可行的替代思路:
1. 使用NotificationListenerService
YouTube Music在后台播放时会显示通知栏,通知里包含了曲目名称、歌手、专辑封面等信息。你可以通过NotificationListenerService监听系统通知,过滤出YTM的通知来提取这些信息。同时,你还可以模拟点击通知栏上的控制按钮(播放/暂停/切歌)来实现控制逻辑。
不过这个方案需要用户手动给你的应用授予“通知访问”权限,体验上会有一点门槛。
2. 使用AccessibilityService
通过辅助功能服务,你可以监听YTM应用的界面控件,获取当前播放的曲目信息,甚至模拟点击界面上的控制按钮。同样,这个方案也需要用户授予辅助功能权限,而且需要适配YTM的界面布局变化(官方可能会更新界面,导致你的控件定位失效)。
总的来说,目前没有完美的方案——如果只是需要基础控制,用广播Intent就足够简单;如果要获取播放信息,只能依赖通知监听或辅助功能这类间接的方式,体验上会有一些妥协。
内容来源于stack exchange

