我正在访问
中的音频文件/数据/用户/ 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()
正在返回null
。 mSessionMediaPlayer.prepare()
正在抛出异常
原因:准备失败:状态= 0x1
我的代码有什么问题?为何获得null
或prepare failed
?我已经测试了它们正在运行的文件,音频文件格式在.aac
。
无法播放第二个音频文件的用户。他能够使用相同的代码播放第一个文件。但是如果同样的方法是从onCompleted()调用它就无法正常工作。为什么这样?
有人可以帮我解决这个问题吗?
答案 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();
}