RemoteControlClient是在 ICS 中引入的。这就是锁屏似乎与各种音乐播放器集成的方式。有关锁定屏幕上的 Spotify 示例,请参阅下面的屏幕截图。
锁屏以外的其他应用程序中的一个也可以与所述播放器集成吗?
我发现文档缺乏关于这个主题的内容,但我认为如果可能的话,结果可能会很有趣。
编辑:
迄今为止的进展:无。我发现IRemoteControlDisplay可能参与其中,但我的 Android/Java 技能有点缺乏真正理解如何实现它并实现与锁定屏幕上相同的功能。
RemoteControlClient是在 ICS 中引入的。这就是锁屏似乎与各种音乐播放器集成的方式。有关锁定屏幕上的 Spotify 示例,请参阅下面的屏幕截图。
锁屏以外的其他应用程序中的一个也可以与所述播放器集成吗?
我发现文档缺乏关于这个主题的内容,但我认为如果可能的话,结果可能会很有趣。
编辑:
迄今为止的进展:无。我发现IRemoteControlDisplay可能参与其中,但我的 Android/Java 技能有点缺乏真正理解如何实现它并实现与锁定屏幕上相同的功能。
在开发我的应用程序时,我实际上发现了如何实现您自己的 RemoteControlDisplay。
基本上,您扩展 IRemoteControlDisplay$Stub,它将消息发送到特殊处理程序,此处理程序更新元数据和事物。然后,通过调用 AudioManager#registerRemoteControlDisplay() 注册您自己的从 IRemoteControlDisplay$Stub 扩展的类。
然后通过调用 AudioManager#unregisterRemoteControlDisplay() 取消注册。
这相当复杂,但我已经写了一篇关于如何做到这一点的文章。我已经在 XDA 上发布了,在这里查看:http: //forum.xda-developers.com/showthread.php?p=44513199
我相信你可以做到这一点。但是,该方法将使用私有 API(这意味着它可能不适用于某些更高版本的 Android 操作系统)。
我建议去下载Android源代码(http://source.android.com/)并检查目录/frameworks/base/media/java/android/media
它有几个您感兴趣的文件:AudioManager.java
音频服务.java
IRemoteControlClient.aidl
IRemoteControlDisplay.aidl
音频管理器有公共方法,没有记录在案,称为 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);
您无法获得与锁定屏幕相同的显示请求,但您当然可以触发此屏幕上的按钮使用广播意图执行的相同事件。
有问题的操作是 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 等)来执行此操作,尽管您不知道当前播放的曲目已将其注册为支持什么,而锁屏却知道。
对于在 KitKat 发布后遇到此问题的任何人,您现在可以使用RemoteController
连接到 RemoteControlClients 并允许您控制它们。
您必须在您的应用程序中实现 IRemoteControl*.aidl 接口,并且应用程序(如 Spotify)必须将自身注册到您的应用程序,目前还不是这样。他们将自己注册到AudioManager。所以不,如果不修改应用程序(Spotify 等)或修改 Android 系统,您将无法捕获那些 RemoteClient 注册,以便您的应用程序可以获取 RemoteClients 及其数据。