Android姜饼锁屏媒体/遥控器在mediaplayer.pause()/播放状态更改时消失

时间:2013-08-29 15:56:29

标签: android audio android-mediaplayer lockscreen remote-control

我的内置媒体控件存在问题,当通过媒体播放器播放音乐时,它会出现在锁定屏幕上。

当音乐播放时,控件始终存在,但是当我按下锁定屏幕上的暂停按钮并通过mediaplayer.pause()暂停媒体播放器,然后关闭屏幕并再次打开(查看再次锁定屏幕,媒体控件已经消失,虽然播放器只是暂停而没有停止。

使用内置的音乐播放器应用程序(也使用媒体播放器),这种情况不会发生。

以下是相关的代码部分:

        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);
    }
}

当按下按钮时,我通过mediabuttonintentreceiver接收暂停事件,然后执行pause()函数。因为我正在为姜饼开发应用程序,所以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);

当我暂停播放时,音频焦点不会丢失,因为我在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_SCREEN_OFF一起启动媒体播放器时才会发生这种情况。

如果我在该意图之前启动媒体播放器,例如在服务的onCreate()函数中然后关闭屏幕,请将其重新打开(锁定屏幕),按暂停按钮,再次将其关闭,最后再次打开,媒体控件在锁定屏幕上可见并处于暂停状态。

但如果我在收到Intent.ACTION_SCREEN_OFF后启动媒体播放器,则会出现上述问题。

它可以与它有关,当问题发生时,我在braodcastreceiver类内部启动媒体播放器,这是在服务内部吗?或者,如果你有一个唤醒锁,你应该在屏幕关闭后不启动媒体播放器吗?

0 个答案:

没有答案