如何捕获mediaplayer数据源没有文件错误?

时间:2013-07-23 06:10:42

标签: android error-handling media-player try-catch android-mediaplayer

我正在使用媒体播放器应用,我从服务器获取带有链接路径的数据源。问题是当我测试时,我故意删除了我提供给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();
            }
        });

2 个答案:

答案 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有多种原因导致错误,您可以检查whatextraMediaPlayer.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;
}