mediaplayer.getDuration()在android 8.1中引发了invalidStateException异常,但在较低版本中工作正常

时间:2018-12-20 10:12:44

标签: android android-mediaplayer android-seekbar

我在我的android应用程序中使用Media Player,该播放器从给定的URL播放音频文件。我还想在播放音频文件时更新进度条。为此,我在onPrepated()方法中使用seekbar.setMax(mediaplayer.getDuration()),但mediaplayer.getDuration()抛出exceptionStateStateException并显示mediaplayer state = 0或1,而相同的代码适用于android 7&较低的版本

我的代码如下:

Map<String, String> map = new HashMap<>();
map.put("X-CSRF-Token",preferences.getString("token",null));
map.put("Cookie",preferences.getString("sessid",null));
map.put("Content-Type","application/json");


mediaPlayer.setDataSource(context,Uri.parse(mediaUrl),map);
mediaPlayer.prepareAsync();

@Override
public void onPrepared(MediaPlayer mp) {
    mediaPlayer.start();
    seekBarProgress.setMax(mediaPlayer.getDuration());
    seekBarProgress.setProgress(0);
    primarySeekBarProgressUpdater(mediaPlayer.getCurrentPosition());
}


// method for updating seekbar

public void primarySeekBarProgressUpdater(final int i) {
    try {
        if (mediaPlayer.isPlaying()) {
            handler = new Handler();
            handler.postDelayed(new Runnable() {
                public void run() {
                    if (mediaPlayer != null && seekBarProgress != null) {
                        if (mediaPlayer.getDuration() > 0) {
                            seekBarProgress.setProgress(mediaPlayer.getCurrentPosition());
                        }
                    }
                    if (handler != null) {
                        handler.postDelayed(this, 1000);
                    }
                }
            }, 1000);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:0)

根据此answer,postDelayed可能导致mediaPlayer处于无效状态,因此调用mediaPlayer.getDuration()将导致IllegalStateException

例如: 如果按回去,则媒体播放器将释放,并且处理程序仍在运行,并致电mediaPlayer.getDuration()

根据开源,另一个假设是mediaPlayer.isPlaying()

/**
* Checks whether the MediaPlayer is playing.
*
* @return true if currently playing, false otherwise
* @throws IllegalStateException if the internal player engine has not been
* initialized or has been released.
*/
public native boolean isPlaying();