0

我正在尝试创建可以控制音乐播放的小部件。基本上与播放音乐时出现在锁屏上的小部件相同。(当我在某处读到时,它已连接到远程控制客户端- 这是真的吗?)我的问题:我能够使用以下代码创建媒体按钮

Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
    synchronized (this) {
        i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT));
        sendOrderedBroadcast(i, null);
        i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT));
        sendOrderedBroadcast(i, null);

首先,我认为这也是锁屏小部件中使用的解决方案。但后来我注意到这个解决方案只适用于某些音乐播放器,但肯定不适用于默认锁屏小部件可以控制的所有内容(fe DoubleTwist 响应锁屏小部件,但不响应我的媒体按钮)。所以我花了几天时间在 Android 资源、Logcat 输出和各种论坛中进行挖掘,但我无法找到我的按钮调用的意图和锁屏小部件上的按钮调用的意图之间的任何区别。

锁屏小部件到底在做什么来控制不听我的媒体按钮意图的应用程序?

或者,至少有人可以帮我找到这个小部件的源代码吗?我尝试了默认的音乐应用程序、音频服务、远程控制客户端、小部件,但我在任何地方都找不到。

4

2 回答 2

1

锁屏小部件到底在做什么来控制不听我的媒体按钮意图的应用程序?

根据文档,它正在做那些应用程序要求它做的事情——执行PendingIntentRemoteControlClient. 尤其:

  • 它不会是有序广播,因为PendingIntent不支持它
  • 它可能是针对特定媒体客户端的,通过setComponent()
  • 它可能有也可能没有您尝试(错误地)使用的附加功能

(“错误”部分是因为您有时会发送两个ACTION_UP操作,因为sendOrderedBroadcast()与调用线程是异步的,因此您可能会在发送第一个有序广播之前替换您ACTION_DOWNACTION_UP。您最好使用每个广播的单独Intent对象。)

然而,虽然文档声称PendingIntent需要为 设置ACTION_MEDIA_BUTTON,但如果这是一个文档错误,我不会感到惊讶,并且不需要任何特定操作,因为setComponent()足以将广播传送到正确的接收器。

于 2013-01-27T17:34:35.427 回答
1

在开发我的应用程序时,我实际上发现了如何实现自己的 RemoteControlDisplay,它可以像锁屏一样控制音乐播放器。

基本上,您扩展了 IRemoteControlDisplay$Stub,它将消息发送到特殊处理程序,此处理程序更新元数据和事物。然后,通过调用 AudioManager#registerRemoteControlDisplay() 注册您自己的从 IRemoteControlDisplay$Stub 扩展的类。

然后通过调用 AudioManager#unregisterRemoteControlDisplay() 取消注册。

It's fairly complex, but I've wrote an article on how to this. I've published it on XDA, check it here: http://forum.xda-developers.com/showthread.php?p=44513199

于 2013-08-11T13:57:26.737 回答