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

and*_*per 3 android playback android-notifications

背景

我想看看是否可以获得有关当前正在播放的歌曲的信息,以便能够显示有关该歌曲的更多信息,或者仅显示我获得的信息。

我想检查一下,因为我注意到在一个名为“Musicolet”的流行音乐播放器应用程序上有一个“广播专辑封面”的设置(此处)。当然,它只说“专辑艺术”,但它也说它适用于“第三方”。所以我想研究一下是否可能。

问题

不确定是否可能。我看到关于它的相互矛盾的答案。

我发现了什么

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

  1. 我还在 StackOverflow(此处)上发现了有关获取它的问题,但它缺少一些关键代码。
  2. 另一方面,我发现另一篇文章说这不是官方的,你可能无法做到这一点,在这里
  3. 我注意到 Spotify 有(或仍然有?)类似的东西(在这里,除了我在那里看不到专辑封面),但它有点旧了。
  4. 我还发现了一个有趣的接口RemoteControlClient.OnMetadataUpdateListener(来自此处),但找不到任何有关它的示例或教程,除了XDA 中的这个

当然,我尝试使用从这些链接中找到的提示,但未能真正发挥作用。

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

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

问题

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

    意思是歌曲标题、专辑名称、文件路径/uri、专辑封面...

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

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

Paw*_*wel 6

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

在某处声明服务:

import android.service.notification.NotificationListenerService

class NotiService : NotificationListenerService()
Run Code Online (Sandbox Code Playgroud)

将其添加到清单中:

<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>
Run Code Online (Sandbox Code Playgroud)

然后你可以将它作为参数传递给getActiveMediaSessionsActivity 内部:

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)))
}
Run Code Online (Sandbox Code Playgroud)

现在导航到“系统设置”->“通知访问”并启用它NotiService,它应该可以正常运行。