所以当我从res / raw文件夹中的应用程序附带的文件播放音频时,基本上一切正常,但是当我想让用户选择自己的文件时,我遇到了麻烦。
对象是将媒体播放器的数据源设置为用户所选文件的URI。然后使用新数据源初始化播放器并播放它。调用play方法时出现错误。最后说我打电话给非法状态(即我没有预先准备好球员),但它确实准备好了。发生了什么,我该如何解决?
调用方法来选择文件:
public void chooseFile(){
Intent intent;
intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("audio/mpeg");
startActivityForResult(Intent.createChooser(intent, chosenAudioFilePath), 1);
}
活动结果方法:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_CANCELED){
if (requestCode == 1 && resultCode == Activity.RESULT_OK){
if ((data != null) && (data.getData() != null)){
userChosenFilePath = data.getData();
setSongToUserPick();
}
}
}}
setSongToUserPick方法:
public void setSongToUserPick(){
stop();
currentAudioPath = userChosenFilePath;
initializePlayer();
stopped = false;
play();
}
停止方法:
public void stop() {
isPlaying = false;
stopped = true;
playPauseButton.setText("Play");
player.stop();
player.release();
}
初始化播放器方法:
public void initializePlayer() {
nowPlayingView.setText(FilenameUtils.getBaseName(currentAudioPath.toString()));
try {
player.setDataSource(thisContext, currentAudioPath);
} catch (IllegalArgumentException | SecurityException
| IllegalStateException | IOException e) {
e.printStackTrace();
}
try {
player.prepare();
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}
最后,Play方法:
public void play() {
if(isPrepared){
isPlaying = true;
playPauseButton.setText("Pause");
player.start();
}else{
System.out.println("Ahhh shit it broke.");
}
}
答案 0 :(得分:0)
如果它可以帮助你,请使用它:
if(currentAudioPath!=null)
player = MediaPlayer.create(thisContext, Uri.parse(currentAudioPath.toString()));
答案 1 :(得分:0)
在播放器上使用onPreparedListener。其中你使用play()方法。 也可以在你的播放器上使用onCompleteListener,因为现在发生的是那个 你所做的所有事情都是同时发生的,而这正是造成问题的原因。
public void play() {
player.setOnCompletionListener(this);
player.setOnPreparedListener(this);
player.setDataSource(uri);
player.prepareAsync();
}
@Override
public void onPrepared(MediaPlayer mp) {
if (!mp.isPlaying()) {
mp.start();
}
}