背景
我想看看我是否可以获得关于当前播放的歌曲的信息,以便能够显示更多关于它的信息,或者只是我获得的信息。
我想去看看,因为我注意到一个流行的音乐播放器应用程序上有一个设置,名为";Musicolet";,的";广播专辑艺术";。当然,上面只写着";专辑艺术";,但它也说这是为了";第三方";。所以我想调查一下这是否可能。
问题
不确定这是否可能。我看到了相互矛盾的答案。
我发现了什么
我发现了一些有趣的链接:
- 我在StackOverflow(这里(上也发现了一个关于获取它的问题,但它缺少一些关键代码
- 另一方面,我发现另一个帖子说这不是官方的,你可能做不到,在这里
- 我注意到Spotify有(或者仍然有?(类似的东西(在这里,除了我在那里看不到专辑艺术(,但它有点旧
- 我还发现了一个有趣的接口RemoteControlClient.OnMetadataUpdateListener(从这里(,但找不到任何关于它的示例或教程,除了XDA的这一个
当然,我试着使用从这些链接中找到的技巧,但没能真正奏效。
所以,也许这在过去是不可能的,然后才有可能。但出于某种原因,我没有看到如何使用它的示例/教程,包括在文档中。
我认为,如果可能的话,它需要通知访问,因为这与从音乐播放器的通知中读取当前播放的音乐大致相同。
问题
-
是否可以注册到歌曲播放时间的回调(也可以随时查询(,并获取有关该歌曲的信息?
意思是歌曲标题、专辑名称、文件路径/uri、专辑艺术。。。
-
如果可能的话,怎么做?它需要什么?
-
如果不可能,有什么变通办法吗?有什么适用于某些应用程序的吗?也许是通知中存在的东西,更正式地说,我可以检测到它是这种类型的,并获取这些信息?
您需要有通知侦听器服务,否则第三方应用程序无法访问媒体会话。
在某处声明服务:
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
启用它,它应该可以毫无问题地运行。