6

我目前正在构建一个流式 Android 应用程序,并且我正在尝试集成一个远程控制客户端(例如从 ICS+ 上的锁定屏幕进行控制)。

为此,我在我的流媒体服务启动时这样做:

    int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

    if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        stopSelf();
    }

    mediaButtonReceiverComponent = new ComponentName(this, RemoteControlReceiver.class);
    audioManager.registerMediaButtonEventReceiver(mediaButtonReceiverComponent);

    if (remoteControlClientCompat == null) {
        final Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        mediaButtonIntent.setComponent(mediaButtonReceiverComponent);
        remoteControlClientCompat = new RemoteControlClientCompat(
                PendingIntent.getBroadcast(
                        getApplicationContext(),
                        0,
                        mediaButtonIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                )
        );
        RemoteControlHelper.registerRemoteControlClient(audioManager, remoteControlClientCompat);
    }

    final int flags = RemoteControlClient.FLAG_KEY_MEDIA_STOP;
    remoteControlClientCompat.setTransportControlFlags(flags);

remoteControlClientCompat只是示例中RemoteControlClientCompat的一个实例。

然后在流式传输期间我正在更新元数据。一切正常,甚至控件都发送到我的RemoteControlReceiver. 数据和图像很好地显示在锁定屏幕上。

从我的应用程序停止流式传输会破坏锁定屏幕的东西,但是当我试图从小部件本身(通过按下停止按钮)破坏它时,它会做一些奇怪的事情。按下停止按钮会使广播接收器停止我的流媒体服务。然后在服务的 onDestroy() 方法中,我这样做:

    RemoteControlHelper.unregisterRemoteControlClient(audioManager, remoteControlClientCompat);
    audioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiverComponent);
    audioManager.abandonAudioFocus(this);

一旦audioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiverComponent);被调用,小部件就会闪烁。我已经尝试评论该行并且闪烁发生在audioManager.abandonAudioFocus(this);. 评论其他行使其在服务停止时也会闪烁。

我注意到当我停止通知中的流式传输时也会发生这种情况。

我究竟做错了什么?我尝试更改此调用的顺序,但无法解决。我注意到 Spotify 在几个版本前也有完全相同的问题。我想知道他们是怎么解决的...

4

1 回答 1

4

好的,我修好了。这只是因为当我们放弃音频焦点时,RemoteControlClient 无法播放。所以我只需要在销毁任何东西之前调用它:

remoteControlClientCompat.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
于 2013-07-18T13:40:36.390 回答