是否可以获取当前播放的歌曲信息



背景

我想看看我是否可以获得关于当前播放的歌曲的信息,以便能够显示更多关于它的信息,或者只是我获得的信息。

我想去看看,因为我注意到一个流行的音乐播放器应用程序上有一个设置,名为";Musicolet";,的";广播专辑艺术";。当然,上面只写着";专辑艺术";,但它也说这是为了";第三方";。所以我想调查一下这是否可能。

问题

不确定这是否可能。我看到了相互矛盾的答案。

我发现了什么

我发现了一些有趣的链接:

  1. 我在StackOverflow(这里(上也发现了一个关于获取它的问题,但它缺少一些关键代码
  2. 另一方面,我发现另一个帖子说这不是官方的,你可能做不到,在这里
  3. 我注意到Spotify有(或者仍然有?(类似的东西(在这里,除了我在那里看不到专辑艺术(,但它有点旧
  4. 我还发现了一个有趣的接口RemoteControlClient.OnMetadataUpdateListener(从这里(,但找不到任何关于它的示例或教程,除了XDA的这一个

当然,我试着使用从这些链接中找到的技巧,但没能真正奏效。

所以,也许这在过去是不可能的,然后才有可能。但出于某种原因,我没有看到如何使用它的示例/教程,包括在文档中。

我认为,如果可能的话,它需要通知访问,因为这与从音乐播放器的通知中读取当前播放的音乐大致相同。

问题

  1. 是否可以注册到歌曲播放时间的回调(也可以随时查询(,并获取有关该歌曲的信息?

    意思是歌曲标题、专辑名称、文件路径/uri、专辑艺术。。。

  2. 如果可能的话,怎么做?它需要什么?

  3. 如果不可能,有什么变通办法吗?有什么适用于某些应用程序的吗?也许是通知中存在的东西,更正式地说,我可以检测到它是这种类型的,并获取这些信息?

您需要有通知侦听器服务,否则第三方应用程序无法访问媒体会话。

在某处声明服务:

import android.service.notification.NotificationListenerService
class NotiService : NotificationListenerService()

将其添加到清单:

<service android:name=".service.NotiService"
android:label="Enable media controls"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>

然后,您可以将其作为参数传递给Activity:中的getActiveMediaSessions

val m = getSystemService<MediaSessionManager>()!!
val component = ComponentName(this, NotiService::class.java)
val sessions = m.getActiveSessions(component)
Log.d("Sessions", "count: ${sessions.size}")
sessions.forEach {
Log.d("Sessions", "$it -- " + (it?.metadata?.keySet()?.joinToString()))
Log.d("Sessions", "$it -- " + (it?.metadata?.getString(MediaMetadata.METADATA_KEY_TITLE)))
}

现在导航到系统设置->Notification Access并为NotiService启用它,它应该可以毫无问题地运行。

最新更新