lyswhut / lx-music-mobile

一个基于 React native 开发的音乐软件
https://lyswhut.github.io/lx-music-doc/
Apache License 2.0
11.19k stars 1.42k forks source link

Try add bluetooth lyric but not work #615

Closed sibojia closed 1 week ago

sibojia commented 2 weeks ago

您好,日常使用中非常希望app能有车载蓝牙歌词功能,repo的issue中也有人多次提到。我对于安卓开发和react开发都不熟,根据互联网资料试图添加蓝牙歌词功能。 目前我是借用了桌面歌词里的LyricPlayer核心逻辑,试图对于每一行歌词更新到蓝牙播放器中,方法上:

  1. 很多网上资料比如 这里这里 都提到使用MediaSession的updateMetadata来实现,先开始直接在Java部分调用
  2. 后来发现 react-native-track-player 内部已经包含了对安卓MediaSession的管理,再创建新的MediaSession有可能有问题,就改为调用它的 TrackPlayer.updateNowPlayingMetadata 函数,这个也是目前这个PR里的代码内容

以上两个版本,在Android Studio中,配合 bumble 在模拟器中调试,都可以正常更新歌词。

image

但是在实际的一辆车上测试,都没有效果,实际表现是一首歌刚开始播放时的第一行歌词能更新,后续就一直不更新了。抓取蓝牙HCI包,并与能正常更新歌词的App比较,发现是Host端没有发送一条TrackChanged消息,应该还是安卓相关代码的问题。 20241028-172128

我后来注意到您使用的是fork并修改过的 react-native-track-player,看来应该也非常了解其中安卓部分的处理。所以想提一下PR,请您帮忙看一下,是否有哪里的实现有问题,有何其他建议。

lyswhut commented 2 weeks ago

大概看了下,其实就是将通知栏的歌曲标题改为歌词,歌手改为标题加歌手


但是在实际的一辆车上测试,都没有效果,实际表现是一首歌刚开始播放时的第一行歌词能更新,后续就一直不更新了。抓取蓝牙HCI包,并与能正常更新歌词的App比较,发现是Host端没有发送一条TrackChanged消息,应该还是安卓相关代码的问题。

如果手机处于亮屏状态,是否可以正常播放歌词?

sibojia commented 2 weeks ago

是的,安卓应该是会自动把这个歌曲信息同步到通知栏以及蓝牙播放器。观察QQ音乐等播放器,在打开蓝牙歌词并且连接车载的时候,通知栏的歌曲信息也会变化。

对亮屏的时候也不行

lyswhut commented 2 weeks ago

这个我后面有时间会看看

lyswhut commented 2 weeks ago

花了一天时间,加了蓝牙歌词支持,可以去 设置-播放设置-显示蓝牙歌词 启用,没在车上测试过,不知道是否可用 可以去 actions 下载最新测试版试试

sibojia commented 1 week ago

花了一天时间,加了蓝牙歌词支持,可以去 设置-播放设置-显示蓝牙歌词 启用,没在车上测试过,不知道是否可用 可以去 actions 下载最新测试版试试

感谢!早上在车上试了没问题,打开歌词可以显示,暂停或者关闭歌词开关可以恢复原歌曲信息显示。

请教一下看到您在发送信息的时候是新增了updateNowPlayingTitles,在react-native-track-player里同样是最终调用session.setMetadata,为啥用updateNowPlayingMetadata就不行,没想明白……

lyswhut commented 1 week ago

请教一下看到您在发送信息的时候是新增了updateNowPlayingTitles,在react-native-track-player里同样是最终调用session.setMetadata,为啥用updateNowPlayingMetadata就不行,没想明白……

应该可以,你可以在dev分支将 updateNowPlayingTitles 替换成 updateNowPlayingMetadata 试试,只是这个会更新通知栏,并且安卓对通知栏的更新频率有限制。

sibojia commented 1 week ago

请教一下看到您在发送信息的时候是新增了updateNowPlayingTitles,在react-native-track-player里同样是最终调用session.setMetadata,为啥用updateNowPlayingMetadata就不行,没想明白……

应该可以,你可以在dev分支将 updateNowPlayingTitles 替换成 updateNowPlayingMetadata 试试,只是这个会更新通知栏,并且安卓对通知栏的更新频率有限制。

我一开始的PR就是用的updateNowPlayingMetadata但是不行,费解……anyway还是非常感谢!