【问题标题】:Is it possible to get currently-playing-song information?是否可以获得当前正在播放的歌曲信息?
【发布时间】:2020-09-07 21:25:46
【问题描述】:

背景

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

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

问题

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

我发现了什么

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

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

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

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

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

问题

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

    意思是歌名、专辑名、文件路径/uri、专辑封面……

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

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

【问题讨论】:

  • 您可以尝试MediaSessionManager.getActiveSessions,确定当前正在播放的会话,然后读取其元数据。这当然假设媒体播放器的开发人员正确构建了媒体会话对象及其元数据。
  • 它会导致需要权限的异常。可以试试吗?

标签: android android-notifications playback


【解决方案1】:

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

在某处声明服务:

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)))
}

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

【讨论】:

  • 但是我怎样才能在开始/停止播放的情况下获得回调呢?以及如何获取各种信息?
  • 您可以通过访问元数据字段获得“各种信息”。如果你想实时更新查看MediaSessionManager/MediaController 文档,他们有注册监听器的方法。
  • 你的意思是 addOnActiveSessionsChangedListener ?如果是这样,则会导致异常:java.lang.SecurityException: Missing permission to control media.。您能否展示其中的任何一个,以展示如何使它们也起作用?
  • 如文档中所述,您必须将通知侦听器服务的组件名称作为参数传递。 Null 为系统应用保留。
  • 最少是曲目标题、专辑标题和封面艺术(拇指)。回调由媒体应用控制,因此我不能保证任何不一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多