Android姜饼锁屏媒体/遥控器在mediaplayer上消失。暂停()/playstate更改
我的内置媒体控件有问题,当音乐通过mediaplayer播放时,它会出现在锁屏上 播放音乐时,控件始终存在,但当我按下锁定屏幕上的暂停按钮并通过mediaplayer暂停mediaplayer时。暂停,然后关闭屏幕并再次打开以再次看到锁定屏幕,媒体控件已消失,尽管播放机仅暂停而未停止 内置音乐播放器应用程序也使用mediaplayer,但这种情况不会发生 以下是相关的代码部分:Android姜饼锁屏媒体/遥控器在mediaplayer上消失。暂停()/playstate更改,android,audio,android-mediaplayer,lockscreen,remote-control,Android,Audio,Android Mediaplayer,Lockscreen,Remote Control,我的内置媒体控件有问题,当音乐通过mediaplayer播放时,它会出现在锁屏上 播放音乐时,控件始终存在,但当我按下锁定屏幕上的暂停按钮并通过mediaplayer暂停mediaplayer时。暂停,然后关闭屏幕并再次打开以再次看到锁定屏幕,媒体控件已消失,尽管播放机仅暂停而未停止 内置音乐播放器应用程序也使用mediaplayer,但这种情况不会发生 以下是相关的代码部分: if (action.equals(Intent.ACTION_SCREEN_OFF)) {
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
if(userPresent)
int result = mAudioManager.requestAudioFocus(mAudioFocusListener,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
configMediaPlayer();
}
userPresent = false;
}
screenOn = false;
}
else if (action.equals(Intent.ACTION_USER_PRESENT)) {
stopMediaPlayer();
userPresent = true;
}
代码在广播接收机中。只有在屏幕关闭、部分唤醒锁定或锁定屏幕出现时,才能播放音乐
private void configMediaPlayer(){
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mediaPlayer.setOnPreparedListener(this);
}
else
mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(getApplicationContext(), Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.song));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.prepareAsync();
}
@Override
public void onPrepared(MediaPlayer mp) {
startMediaPlayer();
}
private void startMediaPlayer(){
mediaPlayer.setLooping(true);
mediaPlayer.start();
}
private void stopMediaPlayer(){
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
暂停事件的功能包括:
public void pause(){
if(isPaused && !userPresent){
startMediaPlayer();
Intent i = new Intent("com.android.music.playstatechanged");
i.putExtra("position", Long.valueOf(123));
i.putExtra("playing", true);
sendStickyBroadcast(i);
isPaused = false;
}
else if (!isPaused && !userPresent){
mediaPlayer.pause();
isPaused = true;
Intent i = new Intent("com.android.music.playstatechanged");
i.putExtra("position", Long.valueOf(123));
i.putExtra("playing", false);
sendStickyBroadcast(i);
}
}
当按下按钮时,我通过MediaButtonEntreceiver接收暂停事件,然后执行暂停功能。因为我正在为姜饼开发应用程序,remotecontrolclient不可用,我发现音乐播放器应用程序中唯一标记播放状态更改的相关内容是:
Intent i = new Intent(what);
i.putExtra("id", Long.valueOf(getAudioId()));
i.putExtra("artist", getArtistName());
i.putExtra("album",getAlbumName());
i.putExtra("track", getTrackName());
i.putExtra("playing", isPlaying());
sendStickyBroadcast(i);
暂停播放时,audiofocus不会丢失,因为我在日志中没有收到来自onaudiochangelistener的消息:
private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
String LOGTAG = "AUDIOFOCUSCHANGELISTENER";
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
Log.e(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS, turning FM off");
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
Log.e(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
Log.e(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
break;
case AudioManager.AUDIOFOCUS_GAIN:
Log.e(LOGTAG, "AudioFocus: received AUDIOFOCUS_GAIN");
break;
default:
Log.e(LOGTAG, "Unknown audio focus change code " + focusChange);
}
}
};
我遗漏了什么或功能不正常?
我希望有人能帮助我,因为我已经在论坛上搜索、谷歌搜索、测试了好几天,但都没有成功
编辑:我忘记提到的是,函数/代码是在后台服务中运行的。也许这是有益的
编辑
好的,我终于把范围缩小到一个更具体的点。只有当我在关闭Intent.ACTION\u屏幕的同时启动mediaplayer时,才会发生这种情况
如果我在该意图之前启动mediaplayer,例如在服务的onCreate功能中,然后关闭屏幕,将其重新打开锁屏,按下暂停按钮,再次关闭,最后再次打开,则媒体控件在锁屏上可见并处于暂停状态
但是如果我在收到Intent.ACTION\u SCREEN\u关闭后启动mediaplayer,则会出现上述问题
当问题发生时,我在服务内部的BraodCastreceRiver类中启动mediaplayer是否与此有关?或者,即使您有唤醒锁,也不应该在屏幕关闭后启动mediaplayer