Android MediaPlayer准备失败:status = 0x1,Mediaplayer.creat()返回带有.AAC音频文件的null

时间:2017-06-10 14:16:59

标签: android android-mediaplayer aac

我正在访问

中的音频文件
  

/数据/用户/ 0 / app_packagename /文件/文件名

我没有WRITE_EXTERNAL READ_EXTERNAL个权限。

现在我可以访问/data/user/0/app_packagename/files/中保存但没有WRITE_EXTERNAL READ_EXTERNAL权限的文件。

并且能够在我的应用程序中播放所有音频文件。

在我的应用程序中,我正在播放队列中的所有文件。第一个音频文件完成后,我的用户很少能够播放第二个音频文件。

以下是我的代码

void playNext(File varientFile) {
    if (mSessionMediaPlayer != null) {
        if (mSessionMediaPlayer.isPlaying()) {
            mSessionMediaPlayer.stop();
        }
        mSessionMediaPlayer.release();
        mSessionMediaPlayer = null;
    }
    mSessionMediaPlayer = new MediaPlayer();
    if (mSessionMediaPlayer != null) {
        Uri uri = Uri.parse(variantFile.getAbsolutePath());                  
     mSessionMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mSessionMediaPlayer.setDataSource(this, uri);      
        mSessionMediaPlayer.setLooping(false);
        mSessionMediaPlayer.prepare();
        mSessionMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                       playNext(mFiles.get(mNextIndex);
            }
        });
        mSessionMediaPlayer.start();
        runScheduler();
    }
}

而不是

  

mSessionMediaPlayer = new MediaPlayer();

我曾尝试过

  

mSessionMediaPlayer = MediaPlayer.create(getApplicationContext(),   URI);

即使MediaPlayer.create()正在返回nullmSessionMediaPlayer.prepare()正在抛出异常

  

原因:准备失败:状态= 0x1

我的代码有什么问题?为何获得nullprepare failed?我已经测试了它们正在运行的文件,音频文件格式在.aac

无法播放第二个音频文件的用户。他能够使用相同的代码播放第一个文件。但是如果同样的方法是从onCompleted()调用它就无法正常工作。为什么这样?

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

不是每次都创建一个新对象,而是尝试使用相同的Media Player对象。

MediaPlayer mSessionMediaPlayer;
mSessionMediaPlayer = MediaPlayer.create(getApplicationContext(),uri);
mSessionMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

    public void onCompletion(MediaPlayer mSessionMediaPlayer) {
       moveToNext(mSessionMediaPlayer,nextUri);
    }

});
mSessionMediaPlayer.prepare();
mSessionMediaPlayer.start();



private void moveToNext(MediaPlayer mSessionMediaPlayer,Uri uri){
     mSessionMediaPlayer.create(getApplicationContext(), uri);
     mSessionMediaPlayer.prepare();
     mSessionMediaPlayer.start();
}