Android媒体播放器:在状态4下调用启动错误(-38,0)
这是我用来从其他类动态获取文件名(.mp3)的代码,因为我的资产文件夹中有许多mp3文件:Android媒体播放器:在状态4下调用启动错误(-38,0),android,android-asynctask,media-player,android-assets,Android,Android Asynctask,Media Player,Android Assets,这是我用来从其他类动态获取文件名(.mp3)的代码,因为我的资产文件夹中有许多mp3文件: playAudioButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FileName audio=new FileName(); Str
playAudioButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
FileName audio=new FileName();
String audioName=audio.getAudioName(count).toString();
if(audioName=="NO Audio")
{
Toast.makeText(getApplicationContext(), "No Audio for this page", Toast.LENGTH_SHORT).show();
}
else
{
try {
afd=getAssets().openFd(audioName + ".mp3");
mp = new MediaPlayer();
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.prepareAsync();
mp.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
日志类别:
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
03-20 11:22:24.968: D/libEGL(4579): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
03-20 11:22:24.976: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
03-20 11:22:24.984: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
03-20 11:22:25.070: D/OpenGLRenderer(4579): Enabling debug mode 0
03-20 11:22:38.773: E/MediaPlayer(4579): start called in state 4
03-20 11:22:38.773: E/MediaPlayer(4579): error (-38, 0)
03-20 11:22:38.773: E/MediaPlayer(4579): Error (-38,0)
需要注意的要点:
1.我已经检查了堆栈溢出上的类似线程,答案是使用prepareAsync()
2.我使用了prepareAsync()
提前感谢。您可以将转换为URI的文件路径传递给
MediaPlayer.create()
这将使它做好准备,并开始发挥自己的作用
或者另一种方法是使用
MediaPlayer
的onPrepareListener()
,然后从此开始准备开始播放您还可以使用下面的onPrepared()
方法调用start方法,以便在MediaPlayer
准备好之后调用start()
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
状态4表示Mediaplayer处于准备状态 我们称之为其他行动,如
Mediaplayer.start()
Mediaplayer.stop()
Mediaplayer.pause()
或者其他任何事情
根据您的代码,它是Mediaplayer.start()代码>
您需要编写onprepare方法
MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
一旦调用Onprepared()方法,就可以执行进一步的处理
移除
mp.start()
之后
而且你将很乐意去公共类背景音乐任务{
public class BackgroundSound extends AsyncTask<String, Void, Void> {
MediaPlayer mediaPlayerChatAudio;
@Override
protected Void doInBackground(String... params) {
String model = params[0];
final Uri uri = Uri.parse(model);
LogEm.e("EM", "::::::::::URI::::::::::" + model);
if (uri == null || uri == Uri.EMPTY) return null;
if (mediaPlayerChatAudio != null) mediaPlayerChatAudio.stop();
try {
mediaPlayerChatAudio = MediaPlayer.create(TextActivity.this, uri);
mediaPlayerChatAudio.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
// do nothing.
}
if (mediaPlayerChatAudio == null) return null;
mediaPlayerChatAudio.setVolume(1.0f, 1.0f);
mediaPlayerChatAudio.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayerChatAudio.reset();
mediaPlayerChatAudio.release();
mediaPlayerChatAudio = null;
}
});
mediaPlayerChatAudio.start();
return null;
}
}
MediaPlayer mediaPlayerChatAudio;
@凌驾
受保护的Void doInBackground(字符串…参数){
字符串模型=参数[0];
最终Uri=Uri.parse(模型);
LogEm.e(“EM”,”:::::URI:::::::::“+model);
if(uri==null | | uri==uri.EMPTY)返回null;
如果(mediaPlayerChatAudio!=null)mediaPlayerChatAudio.stop();
试一试{
mediaPlayerChatAudio=MediaPlayer.create(TextActivity.this,uri);
mediaPlayerChatAudio.setAudioStreamType(AudioManager.STREAM_MUSIC);
}捕获(例外e){
//什么也不做。
}
如果(mediaPlayerChatAudio==null)返回null;
mediaPlayerChatAudio.setVolume(1.0f,1.0f);
mediaPlayerChatAudio.setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
mediaPlayerChatAudio.reset();
mediaPlayerChatAudio.release();
mediaPlayerChatAudio=null;
}
});
mediaPlayerChatAudio.start();
返回null;
}
}
可能您在准备就绪之前调用getCurrentPosition,此问题的根源是媒体错误
mp.prepareAsync();
public class BackgroundSound extends AsyncTask<String, Void, Void> {
MediaPlayer mediaPlayerChatAudio;
@Override
protected Void doInBackground(String... params) {
String model = params[0];
final Uri uri = Uri.parse(model);
LogEm.e("EM", "::::::::::URI::::::::::" + model);
if (uri == null || uri == Uri.EMPTY) return null;
if (mediaPlayerChatAudio != null) mediaPlayerChatAudio.stop();
try {
mediaPlayerChatAudio = MediaPlayer.create(TextActivity.this, uri);
mediaPlayerChatAudio.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
// do nothing.
}
if (mediaPlayerChatAudio == null) return null;
mediaPlayerChatAudio.setVolume(1.0f, 1.0f);
mediaPlayerChatAudio.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayerChatAudio.reset();
mediaPlayerChatAudio.release();
mediaPlayerChatAudio = null;
}
});
mediaPlayerChatAudio.start();
return null;
}
}