RemoteControlClient是在ICS中引入的。它是锁屏与各种音乐播放器相互整合的方式。请参见下面的截图,例如Spotify在锁屏上的显示。
除了锁屏之外,来自另一个应用程序的内容也可以与这些播放器相互整合吗?
我发现文档在此方面有些欠缺,但如果可能的话,结果可能会很有趣。
编辑:
目前为止没有进展。我了解到IRemoteControlDisplay可能在其中扮演一定角色,但我的Android / Java技能有点不足以真正理解如何实现它并实现与锁屏相同的功能。
RemoteControlClient是在ICS中引入的。它是锁屏与各种音乐播放器相互整合的方式。请参见下面的截图,例如Spotify在锁屏上的显示。
除了锁屏之外,来自另一个应用程序的内容也可以与这些播放器相互整合吗?
我发现文档在此方面有些欠缺,但如果可能的话,结果可能会很有趣。
编辑:
目前为止没有进展。我了解到IRemoteControlDisplay可能在其中扮演一定角色,但我的Android / Java技能有点不足以真正理解如何实现它并实现与锁屏相同的功能。
我相信你可以做到这一点。但是,该方法将使用私有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(另一个未记录的接口)的对象,并且您应该能够通过此对象控制播放器。
试试这个
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);
RemoteControlClient
。 - Stephan你无法直接展示和锁屏相同的请求,但是你可以使用广播意图来触发在锁屏界面上按钮执行的相同事件。
相关行为为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等),但是你不会知道当前正在播放的曲目所支持的按键代码,而锁屏界面则会。
您需要在您的应用程序中实现IRemoteControl*.aidl接口,而应用程序(如Spotify)需要注册到您的应用程序中,但目前还没有这种情况。它们会将自己注册到AudioManager。因此,如果不修改应用程序(如Spotify等),或者修改Android系统以便您的应用程序可以获取RemoteClients及其数据,那么您将无法捕获这些RemoteClient注册。