19

RemoteControlClient是在 ICS 中引入的。这就是锁屏似乎与各种音乐播放器集成的方式。有关锁定屏幕上的 Spotify 示例,请参阅下面的屏幕截图。

在此处输入图像描述

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

我发现文档缺乏关于这个主题的内容,但我认为如果可能的话,结果可能会很有趣。

编辑:

迄今为止的进展:无。我发现IRemoteControlDisplay可能参与其中,但我的 Android/Java 技能有点缺乏真正理解如何实现它并实现与锁定屏幕上相同的功能。

4

6 回答 6

8

在开发我的应用程序时,我实际上发现了如何实现您自己的 RemoteControlDisplay。

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

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

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

于 2013-08-11T13:53:18.067 回答
6

我相信你可以做到这一点。但是,该方法将使用私有 API(这意味着它可能不适用于某些更高版本的 Android 操作系统)。

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

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

音频服务.java

IRemoteControlClient.aidl

IRemoteControlDisplay.aidl

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

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

于 2012-08-31T15:02:36.513 回答
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);
于 2012-09-04T07:22:30.803 回答
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 等)来执行此操作,尽管您不知道当前播放的曲目已将其注册为支持什么,而锁屏却知道。

于 2013-03-07T15:58:16.600 回答
2

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

于 2014-05-27T08:41:48.963 回答
0

您必须在您的应用程序中实现 IRemoteControl*.aidl 接口,并且应用程序(如 Spotify)必须将自身注册到您的应用程序,目前还不是这样。他们将自己注册到AudioManager。所以不,如果不修改应用程序(Spotify 等)或修改 Android 系统,您将无法捕获那些 RemoteClient 注册,以便您的应用程序可以获取 RemoteClients 及其数据。

于 2012-09-06T12:00:31.667 回答