如何创建“类似锁屏”的音乐播放控件

时间:2013-01-27 16:15:51

标签: android button android-intent widget

我正在尝试创建可以控制音乐播放的小部件。基本上与播放音乐时锁屏上显示的小部件相同。 (当我在某处读到时,它与Remote Control Client相关联 - 这是真的吗?)我的问题: 我能够使用以下代码创建媒体按钮

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

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

lockscreen小部件究竟在做什么来控制没有收听我的媒体按钮意图的应用?

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

2 个答案:

答案 0 :(得分:1)

  

lockscreen小部件究竟在做什么来控制没有收听我的媒体按钮意图的应用程序?

根据文档,它正在执行这些应用要求它执行的操作 - 执行PendingIntent提供给它的RemoteControlClient。值得注意的是:

  • 它不会是有序广播,因为PendingIntent不支持
  • 可以通过setComponent()
  • 定位特定媒体客户端
  • 它可能会或可能没有您正在尝试(错误地)使用的附加内容

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

但是,虽然文档声称需要为PendingIntent设置ACTION_MEDIA_BUTTON,但如果这是文档错误,并且不需要采取任何具体操作,我不会感到惊讶,因为{ {1}}足以将广播传送给正确的接收者。

答案 1 :(得分:0)

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

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

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

这相当复杂,但我写了一篇关于如何做到这一点的文章。 我已经在XDA上发布了它,请在这里查看: http://forum.xda-developers.com/showthread.php?p=44513199