安卓远程控制客户端

19

RemoteControlClient是在ICS中引入的。它是锁屏与各种音乐播放器相互整合的方式。请参见下面的截图,例如Spotify在锁屏上的显示。

enter image description here

除了锁屏之外,来自另一个应用程序的内容也可以与这些播放器相互整合吗?

我发现文档在此方面有些欠缺,但如果可能的话,结果可能会很有趣。

编辑:

目前为止没有进展。我了解到IRemoteControlDisplay可能在其中扮演一定角色,但我的Android / Java技能有点不足以真正理解如何实现它并实现与锁屏相同的功能。

6个回答

8
在开发我的应用程序时,我实际上发现了如何实现自己的遥控显示器。基本上,您需要扩展IRemoteControlDisplay$Stub接口,该接口会将消息发送到特殊的处理程序,该处理程序将更新元数据和其他内容。然后,通过调用AudioManager#registerRemoteControlDisplay()方法来注册扩展自IRemoteControlDisplay$Stub接口的自己的类。
最后,当您需要取消注册时,可以通过调用AudioManager#unregisterRemoteControlDisplay()方法进行取消注册。
这个过程相当复杂,但我已经在如何实现它的文章中进行了介绍。我已经在XDA上发布了这篇文章,请查看: http://forum.xda-developers.com/showthread.php?p=44513199

很棒的帖子!暂时只是浏览了一下,但你似乎提供了如何自己实现这个的优秀指南。 - Frans
2
另外,你现在可以使用我的库,这将使过程非常简单: http://forum.xda-developers.com/showthread.php?p=45288378 - Alexander Woodblock
如果我的项目能被开发出来,我一定会给你捐款的 :) - Frans
使用mediaPlayer是否可行?如果是,请给我提供参考链接或代码。关于我的问题的更多细节,请查看问题。 - Chirag Solanki

6

我相信你可以做到这一点。但是,该方法将使用私有API(暗示可能无法在某些Android OS的较新版本上工作)。

我建议去下载Android源代码(http://source.android.com/),并检查目录/frameworks/base/media/java/android/media

它有几个文件是你感兴趣的点:

AudioManager.java

AudioService.java

IRemoteControlClient.aidl

IRemoteControlDisplay.aidl

Audio manager有一个公共方法(未记录在文档中),名为registerRemoteControlDisplay。您应该能够通过反射访问它。

使用此接口,您可以注册实现IRemoteControlDisplay(另一个未记录的接口)的对象,并且您应该能够通过此对象控制播放器。


1
考虑到剩下的时间不多,这个就只能凑合了!我还没来得及试一下,但你确实给了我希望,说明它是可行的。 - Frans

5

试试这个

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
                AudioManager.AUDIOFOCUS_GAIN);
        Bitmap AlbumArt=BitmapFactory.decodeResource(getResources(), R.drawable.alislahthumbmain);
        mIslahReceiverComponent=new ComponentName(this,AlIslahReceiver.class.getName());
audioManager.registerMediaButtonEventReceiver(mIslahReceiverComponent);
        Intent mediaButtonIntent=new Intent(Intent.ACTION_MEDIA_BUTTON);
        mediaButtonIntent.setComponent(mIslahReceiverComponent);
        PendingIntent mediaPendingIntent=PendingIntent.getBroadcast(getApplicationContext(),
                0,mediaButtonIntent,0);
        RemoteControlClient mRemoteControlClient=new RemoteControlClient(mediaPendingIntent);
        mRemoteControlClient.editMetadata(true)
        .putString(MediaMetadataRetriever.METADATA_KEY_TITLE,AlIslahApplication.getStreamTitle())
        .putBitmap(100,AlbumArt)
        .apply();
        mRemoteControlClient.setPlaybackState(
                RemoteControlClient.PLAYSTATE_PLAYING);
        mRemoteControlClient.setTransportControlFlags(
               RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE|
                RemoteControlClient.FLAG_KEY_MEDIA_STOP);
        audioManager.registerRemoteControlClient(mRemoteControlClient);

2
问题不在于如何使用RemoteControlClient - Stephan
正如Stephan所说,问题不在于如何实现RemoteControlClient,而在于如何找到并控制已经存在的RemoteControlClient。 - Frans

3

你无法直接展示和锁屏相同的请求,但是你可以使用广播意图来触发在锁屏界面上按钮执行的相同事件。

相关行为为ACTION_MEDIA_BUTTON,你需要连接一个带有适当keyCode的KeyEvent来实现你想要的操作。

Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
intent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
            KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE));
sendBroadcast(intent);

这将会和在锁屏界面上按下播放/暂停按钮一样。你可以使用其他有意义的KeyEvent键代码来完成此操作(例如KEYCODE_MEDIA_NEXT等),但是你不会知道当前正在播放的曲目所支持的按键代码,而锁屏界面则会。


其实,我不确定这个做的是同样的事情。也许我们可以在某种程度上模仿播放/暂停、下一首甚至上一首的结果,但通信方式并不相同。使用这种方法,命令可能会起作用,但也可能不会。此外,据我所知,这需要具体的进程来发送意图,我们无法进行系统范围的广播。 - Frans
我不确定你的信息来源是什么,但你是错的。这是使用与锁屏相同的通信协议,也就是广播意图。 - chrisrhoden
IRemoteControlDisplay的实现如何知道将意图发送到哪里?如果我们假设这是它控制媒体播放器的方式。 - Frans
自Android 2.2以来,可以在运行时注册特定的BroadcastReceiver,成为携带MEDIA_BUTTON操作的BroadcastIntent的唯一接收者。这意味着,如果您发送一个带有MEDIA_BUTTON操作的意图,它将发送到最近注册为此类意图的唯一接收者的组件。RemoteControlClient注册过程要求您已经以这种方式注册了相同的BroadcastReceiver组件。请查看示例的第3行:http://developer.android.com/reference/android/media/RemoteControlClient.html - chrisrhoden
谢谢你提供了一个很好的指导!如果我传播了恐惧、不确定性和怀疑,我向你道歉,这并不是我的本意。是的,我将它视为一个黑盒子,并且我的一些观点是基于自由职业者告诉我的事情。虽然我是一名开发人员,但对于Android来说,我还是个新手,因为我没有时间去学习它。我想我应该多学一些关于它的知识。 - Frans
显示剩余4条评论

2

如果您在KitKat版本发布后遇到此问题,现在可以使用RemoteController,它连接到RemoteControlClients并允许您控制它们。


0

您需要在您的应用程序中实现IRemoteControl*.aidl接口,而应用程序(如Spotify)需要注册到您的应用程序中,但目前还没有这种情况。它们会将自己注册到AudioManager。因此,如果不修改应用程序(如Spotify等),或者修改Android系统以便您的应用程序可以获取RemoteClients及其数据,那么您将无法捕获这些RemoteClient注册。


啊,真遗憾。你有没有其他方法可以通用地控制音乐播放器?或者每个播放器都需要特殊的解决方案?不考虑默认的音乐播放器。 - Frans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接