Android的远程控制客户端

时间:2012-08-28 21:52:50

标签: java android

RemoteControlClient是在ICS中引入的。这就是锁屏似乎与各种音乐播放器融为一体的方式。请参阅下面的屏幕截图,了解锁定屏幕上的Spotify示例。

enter image description here

除锁定屏幕之外的其他应用程序中的一个还可以与所述播放器集成吗?

我发现文档在这个问题上缺乏一点,但我认为如果可能的话,结果会很有趣。

修改

到目前为止的进展:没有。我发现 IRemoteControlDisplay 可能在其中有一部分,但我的Android / Java技能有点缺乏实际了解如何实现它并实现与锁定屏幕相同的功能

6 个答案:

答案 0 :(得分:8)

在处理我的应用程序时,我实际上已经找到了如何实现自己的RemoteControlDisplay。

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

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

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

答案 1 :(得分:5)

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

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

它有几个你感兴趣的文件: AudioManager.java

AudioService.java

IRemoteControlClient.aidl

IRemoteControlDisplay.aidl

音频管理器有公共方法,没有记录,称为registerRemoteControlDisplay。你应该能够通过反思来访问它。

使用此界面,您可以注册实现IRemoteControlDisplay(另一个未记录的界面)的对象,您应该能够通过此对象控制玩家。

答案 2 :(得分:4)

试试这个

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

答案 3 :(得分: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等等)执行此操作,但您不会知道当前正在播放的曲目已将其自身注册为支持,而锁定屏幕则为。

答案 4 :(得分:2)

对于任何在KitKat发布后发现此问题的人,您现在可以使用连接到RemoteControlClients的RemoteController,并允许您控制它们。

答案 5 :(得分:0)

您必须在应用程序中实现IRemoteControl * .aidl界面,而应用程序(如Spotify)必须将自己注册到您的应用程序,但情况并非如此。 他们将自己注册到AudioManager。所以不,你无法在没有修改应用程序(Spotify等)或修改Android系统的情况下捕获那些RemoteClient注册,因此你的应用程序可以获取RemoteClients及其数据。