我在我的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();
}
}
答案 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();