Android姜饼锁屏媒体/遥控器在mediaplayer上消失。暂停()/playstate更改

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)) {

我的内置媒体控件有问题,当音乐通过mediaplayer播放时,它会出现在锁屏上

播放音乐时,控件始终存在,但当我按下锁定屏幕上的暂停按钮并通过mediaplayer暂停mediaplayer时。暂停,然后关闭屏幕并再次打开以再次看到锁定屏幕,媒体控件已消失,尽管播放机仅暂停而未停止

内置音乐播放器应用程序也使用mediaplayer,但这种情况不会发生

以下是相关的代码部分:

        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