跨平台音乐遥控器

管乐

把网易云音乐、QQ音乐和哔哩哔哩的歌曲放进同一个曲库,用官方 App 播放,用本应用管理队列和切歌。

播放队列 Live
跨平台歌单 官方 App 播放
网易云音乐 03:42
QQ音乐 04:08
酷狗音乐 03:55
哔哩哔哩 05:16

关于名字

管乐 · Tutti

"管乐" 是中文里对吹奏乐器(长笛、单簧管、小号等)的统称——它们音色各异,却能在同一份曲谱下合奏。"Tutti" 是意大利语乐谱中的术语,意为"全员齐奏",指挥示意所有乐手一起演奏的那一瞬间。

把网易云、QQ 音乐、酷狗、哔哩哔哩看作不同的乐器,按同一份"曲谱"——你的播放队列——依次合奏,就是这个应用想做的事。我们不替换任何乐器,只递交曲谱、切换节拍。

另:管字本身也带有"管理"之意,是工程层面的一个小小双关。

核心定位

它不是播放器,而是跨平台遥控器。

Tutti 不播放、不下载、不缓存任何音乐。它通过深度链接打开官方 App,让你继续使用原平台会员和曲库。

平台 App

只管理自己的歌单和曲库,很难把多平台歌曲放进同一个播放队列。

聚合播放器

通常依赖逆向接口或抓取音频数据,维护成本高,也容易触碰平台限制。

管乐

统一管理跨平台歌单,播放时调起官方 App,自动衔接下一首。

工作方式

从分享链接到跨平台连续播放。

我们把复杂流程拆成四件事:识别歌曲、保存队列、委托播放、监听状态。用户看到的是一份统一歌单,底层仍按各平台自己的播放规则运作。

01

歌曲入库

从音乐 App 分享链接或直接粘贴,LinkParser 会解析短链接、平台 ID、标题和艺术家,再由对应平台的处理器补齐元数据。

02

统一队列

歌曲以“平台 + 平台歌曲 ID”为唯一标识写入本地 Room 数据库,可以混排进同一个播放列表。

03

播放委托

播放时生成网易云、QQ 音乐、酷狗或 B 站的目标链接,唤起对应官方 App 完成实际播放,保留会员权益。

04

状态监听

通过 Android MediaSession 与通知访问权限读取播放状态和进度,在接近结尾时自动切到队列里的下一首。

功能特点

为日常听歌场景准备的实用能力。

跨平台曲库

把网易云、QQ 音乐、酷狗音乐和 B 站的内容当作统一的元数据来管理,不会把音频文件搬进应用本身。

歌单订阅与合并

把远程歌单关联到本地歌单,按同步源增量更新,同时保留手动添加的歌曲。

智能自动切歌

播放前先检测可用性,失败时自动跳过;切歌时也会处理上一首平台没停掉、新一首启动较慢等情况。

跨 App 悬浮控制

在任意 App 上方查看当前歌曲、控制播放、拖动进度,可以在完整窗口和迷你浮球之间随意切换。

发现与推荐聚合

汇总排行榜、分类歌单和已登录平台的每日推荐,支持一键加入跨平台队列。

双设备远程控制

播放端在本机开放 HTTP/WebSocket 控制接口,控制端实时同步状态并发送操作指令。

后台播放模式

借助 Shizuku 把音乐 App 启动到 freeform 窗口里,并放到屏幕之外,让 Tutti 的浮球持续显示在前台。

单曲提前结束

长按歌曲为它设置自定义的 mm:ss 时长,跳过冗长的开场或片尾,到点自动切到下一首。

数据导入与导出

把歌曲、歌单和同步源导出为 JSON 文件,方便跨设备迁移,备份之后也可以一键还原。

首次启动权限引导

首次启动时通过引导页面,带你依次完成悬浮窗、通知访问、无障碍等 6 项权限的授权。

本地优先存储

歌单数据保存在设备本地数据库里,不需要账号服务器,也不会把播放记录上传到任何地方。

分享链接入库

在音乐 App 的分享面板里把链接发送到 Tutti,自动识别平台、歌曲 ID 和元数据。

网易云音乐
QQ音乐
酷狗音乐
哔哩哔哩

安装前说明

把权限和限制讲清楚。

Tutti 把播放委托给官方 App,这种架构本身就有边界。下面把需要的权限,以及目前还没有完美解决方案的问题都列了出来,希望你在试用之前心里有数。

需要的权限

如果你已经在设备上启用了 Shizuku 并允许 Tutti 使用,那么以下权限会在每次启动时由 Tutti 通过 Shizuku 自动批量授予,不需要手动一个一个点开系统设置。完成时会弹一条可滑动关闭的通知,列出本次新增的授权项目。可以在"设置 → 启动模式 → 通过 Shizuku 自动授予所需权限"里关掉。

  • 必需 悬浮窗权限:在其他 App 上方显示播放控制,并在切歌时直接拉起音乐 App,绕开"是否打开外部应用"弹窗。
  • 必需 通知权限:用于显示前台服务通知(Android 13 及以上),系统据此判断后台服务是否合法运行。
  • 推荐 通知使用权:读取系统媒体会话状态,监听进度与歌曲结束事件,实现自动切到下一首。不授权则无法自动切歌。
  • 推荐 无障碍服务(QQ 音乐):QQ 音乐的深度链接只会跳到首页或迷你卡片,不能直接打开播放页;这个服务在 QQ 音乐前台时模拟点击迷你播放器,把页面切到完整播放/歌词页。网易云、酷狗、B 站的深度链接已经能直达播放页,所以不需要它。
  • 推荐 系统设置写入:网易云的横屏播放页(PlayerLandscapeActivity)是一个独立的 Activity,只在 PlayerActivity 检测到方向变化时才会启动;所以前台模式下播放网易云且设备已经处于横屏时,需要先把系统旋转锁成竖屏,等 PlayerActivity 启动后再恢复原设置,凑出一次"竖→横"转变(约 7–10 秒)。其他平台的播放页通过标准的方向变更回调在同一个 Activity 里切换横竖屏布局,不需要这个绕路。
  • 推荐 使用情况访问:浮球双击返回上一个 App 时需要查询最近任务列表。
  • 可选 无障碍服务(后台启动):后台模式下,HyperOS 的手势导航偶尔会把音乐 App 的 freeform 窗口"吸"回主屏;这个服务侦测窗口位置变化,被拉回后立即再次推到屏幕外。注意:它不能消除切歌瞬间 freeform 窗口创建到 resize 之间的短暂闪现——那是 Android 先按默认尺寸创建任务、然后才能 resize 的固有时序,目前没有完美解决办法。
  • 可选 Shizuku:启用后台启动模式需要它来调用 am start --windowingMode 5。不安装则只能使用前台模式(切歌时官方 App 会跳到前台)。

已知限制

  • 前台模式下切歌时官方 App 会跳到前台;后台模式可以避开这一点,但需要 Shizuku。
  • MediaSession 的 playFromMediaId / playFromUri / playFromSearch 在网易云和 QQ 音乐里都不会触发实际播放,只能依赖深度链接启动。
  • 前台模式下播放网易云时,如果设备已经处于横屏,需要先把系统旋转方向锁成竖屏再恢复,约 7–10 秒——网易云的横屏播放页是独立的 PlayerLandscapeActivity,只在 PlayerActivity 检测到方向变化时才会启动,所以必须制造一次"竖→横"转变。后台模式下 freeform 窗口规避了这个问题。
  • QQ 音乐没有提供能直接打开播放页的深度链接。前台模式下我们用无障碍服务模拟点击迷你播放器条进入完整播放页,从启动到切入大约 1–8 秒,偶尔会因为页面层级变化而失败、回退到 QQ 音乐首页。后台模式下没有可见的页面切换,这个延迟和失败都看不到。
  • 四家平台都没有对外开放过官方文档化的歌单 API——我们用的都是各家 Web/App 自己在调的内部接口。差别在于:网易云、QQ 音乐、B 站的这类接口不要求登录就能拿到公开歌单的数据;只有酷狗会在未登录时统一返回 4xx。所以酷狗歌单通过解析分享页里服务端渲染的歌曲数据来读取,个别字段缺失的歌曲可能无法导入。
  • 会员歌曲仍然需要你拥有对应平台的会员,管乐 不会绕过任何鉴权。
  • 当前发布的是预览版,可能在边角场景下崩溃,欢迎在 GitHub 上提 Issue。

寻求帮助

我们希望和更多人一起把这些限制慢慢解掉。

Tutti 完全开源,目前由一位非 Android 出身的开发者在维护。下面列出的每一项都不是我们故意这么做,而是暂时还没找到解决方案的实际问题。如果你在其中任何一项上有经验,欢迎在 GitHub 上提 Issue、发 PR,或者只是分享一些思路。

Android 系统层

无 Shizuku 的后台播放

setLaunchWindowingMode 只对持有签名级权限的 App 生效,目前我们只能借助 Shizuku 调用 am start --windowingMode 5。如果你知道有什么办法能让一个普通 App 把音乐 App 放到后台或画中画窗口里,请告诉我们。

平台 API

酷狗 / QQ / 网易官方接口

酷狗的 songlist 接口在未登录状态下全部返回 4xx,我们目前只能抓取服务端渲染的 HTML。如果你熟悉这几家平台的公开 API、登录签名或合作伙伴接入方式,可以帮我们摆脱抓取页面的做法。

MediaSession

让官方 App 真正接受播放指令

所有 playFromMediaId / playFromUri / playFromSearch 调用都会被网易云和 QQ 音乐忽略;actions 字段虽然声明了对应能力,实际却是空操作。我们想知道有没有 MediaBrowserService 或厂商私有指令可以真正触发切歌。

新平台

新增平台处理器

我们希望把酷我、咪咕、Apple Music 中国区等平台也接入进来。只要实现 PlatformHandler 接口(链接解析、元数据获取、深度链接生成),就能加入跨平台队列。欢迎提 PR。

机型适配

HyperOS / MIUI / EMUI 适配

HyperOS 会在重装应用后悄悄解绑 NotificationListenerService,手势导航也会把 freeform 窗口吸附回主屏。如果你在自己的设备上发现 Tutti 表现异常,欢迎附上 logcat 和复现步骤。

文档与翻译

使用文档与多语言

目前文档主要支持中文和英文。如果你愿意帮忙翻译界面、撰写权限设置教程,或者把疑难解答整理成文章,欢迎直接向 site/README.md 提 PR。

Android 下载

获取 Tutti 预览版

下载 APK 后在 Android 8.0 及以上设备安装。首次使用需要按提示授予悬浮窗、通知和无障碍相关权限。

preview 下载 APK

APK 会随 Cloudflare Pages 构建一起生成;也可用 VITE_DOWNLOAD_URL 指向外部下载地址。