3

我有一个媒体播放器应用程序,我在其中使用链接路径从服务器获取我的数据源。问题是当我在测试时,我故意删除了我mp.setDataSource(musicUri);要检查的音频链接路径的数据源文件,但我似乎无法捕捉到错误并解决它。

我已经替换了我mp.prepare();的 tomp.prepareAsync();和 simple mp.start()to

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

2 回答 2

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。看看这个问题的解决方案是否适合你。

于 2013-07-23T06:25:19.863 回答
0

MediaPlayer 错误的原因有多种,您可以检查whatextra中的值MediaPlayer.OnErrorListener.onError,并执行与错误原因相关的操作,例如显示 Toast 以通知用户。

当 Uri 中的文件不可用时,它将返回extravalue -1004,根据文档是File or network related operation errors.

这是 MediaType文档中错误代码的另一个链接

代码如下:

@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;
}
于 2016-01-06T12:01:24.810 回答