我正在使用媒体播放器应用,我从服务器获取带有链接路径的数据源。问题是当我测试时,我故意删除了我提供给mp.setDataSource(musicUri);
的音频链接路径的数据源文件以进行检查,但我似乎无法捕获错误并解决它。
我已将mp.prepare();
替换为mp.prepareAsync();
,将简单mp.start()
替换为
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
在开始播放前准备好媒体播放器。
这是堆栈跟踪:
07-23 13:55:52.492: E/MediaPlayer(6870): Attempt to call getDuration without a valid mediaplayer
07-23 13:55:52.492: E/MediaPlayer(6870): error (-38, 0)
07-23 13:55:52.492: E/MediaPlayer(6870): Error (-38,0)
07-23 13:55:52.492: E/MediaPlayer(6870): stop called in state 0
07-23 13:55:52.492: E/MediaPlayer(6870): error (-38, 0)
07-23 13:55:52.492: E/MediaPlayer(6870): error (1, -107)
似乎没有任何作用,我想抓住这个错误来修复它会对媒体播放器造成的异常结果。任何帮助都可以。谢谢!
修改
好的,所以我添加了onErrorListener但仍无效:
mp.reset();
mp.setDataSource(musicUri);
mp.prepareAsync();
// mp.prepare();
mp.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(final MediaPlayer mp, final int what,
final int extra) {
Log.e(Constant.TAG_MYREC, "Error occurred while playing audio.");
mp.stop();
return false;
}
});
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
答案 0 :(得分:4)
mMediaPlayer.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(final MediaPlayer mp, final int what,
final int extra) {
Log.e("Error occurred while playing audio.");
mp.stop();
您可能在文件完全加载之前调用getDuration。看看this question的解决方案是否适合您。
答案 1 :(得分:0)
MediaPlayer有多种原因导致错误,您可以检查what
中extra
和MediaPlayer.OnErrorListener.onError
的值,并执行与错误原因相关的操作,例如show Toast通知用户。
当Uri中的文件不可用时,它将返回extra
,其值为-1004
,根据文档为File or network related operation errors
。
以下是MediaType documentation
中错误代码的另一个链接代码如下:
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.i(TAG, "onError, what: " + what + ", extra: " + extra);
if (extra == MediaPlayer.MEDIA_ERROR_IO) {
// TODO Show Toast
}
mp.stop();
// If you choose not to call onCompletion
return true;
}