Android Media Player: Start called in state 4 error(-38,0)
Solution 1
You can also use below onPrepared()
method to call start method so that start()
is called after MediaPlayer
is prepared.
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
Solution 2
Instead of using this preparedSync/prepare
method of MediaPlayer
you can just pass the file path converting into URI to the MediaPlayer.create()
MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath));
this will prepare it and start playing itself
Or another way is use onPrepareListener()
of MediaPlayer
and then from this on prepared start playing
Solution 3
state 4 means Mediaplayer is in preparing state
and we call other actions like
Mediaplayer.start()
Mediaplayer.stop()
Mediaplayer.pause()
or any other thing .
As per your code it is Mediaplayer.start();
you need to write onprepare method
MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
}
});
Once Onprepared() method called you can do further process
just remove
mp.start()
after
mp.prepareAsync();
And you will good to go
D'yer Mak'er
Beginner in Android. Worked on SharePoint Portal design before.
Updated on August 05, 2022Comments
-
D'yer Mak'er over 1 year
This is the code am using to fetch a file name(.mp3) dynamically from some other class as am having many mp3 files in my assets folder:
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(); } } } }); }
Log Cat :
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)
Points to be noted: 1. I have checked similar threads on stack overflow the answer is using prepareAsync() 2. I have used prepareAsync()
Thanks in advance.