我目前正在构建一个流式 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 在几个版本前也有完全相同的问题。我想知道他们是怎么解决的...