Android MediaPlayer - setDataSource and Release - IllegalStateException -
i wrote own mediaplayer class play files @ specific path , play files assets folder. here class:
public class cmediaplayer extends mediaplayer{ public void play(string audiopath){ this.setoncompletionlistener(new oncompletionlistener() { @override public void oncompletion(mediaplayer mp) { mp.release(); } }); file f = new file(audiopath); if(f.exists()){ try{ fileinputstream fis = new fileinputstream(f); filedescriptor filed = fis.getfd(); this.setdatasource(filed); this.prepare(); }catch(ioexception e){ } this.start(); } } public void play(assetfiledescriptor descriptor){ this.setoncompletionlistener(new oncompletionlistener() { @override public void oncompletion(mediaplayer mp) { mp.release(); } }); try { this.setdatasource(descriptor.getfiledescriptor(), descriptor.getstartoffset(), descriptor.getlength()); descriptor.close(); this.prepare(); }catch (ioexception e){ } this.start(); } }
i want play several sounds class activity. here code:
public class playgame extends activity { //a lot of variables cmediaplayer mediaplayer; //declare mediaplayer @override public boolean onkeydown(int keycode, keyevent event) { if (keycode == keyevent.keycode_back ) { //release?????? intent myintent = new intent(getbasecontext(), startview.class); startactivity(myintent); } return super.onkeydown(keycode, event); } protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_play_question2); mediaplayer = new cmediaplayer(); //define mediaplayer //stuff } //more variables public void playquestion(file question){ //stuff textview mytextview = (textview) findviewbyid(r.id.textviewquestion); //stuff mytextview.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { mediaplayer.play(pathsoundquestion); //play sound when clicked } }); //stuff myimageview.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { mediaplayer.play(pathsoundquestion); //play sound when clicked } }); //stuff mediaplayer.play(pathsoundquestion); //plays sound immediatly, first played sound (works fine) //button1 button mybutton = (button) findviewbyid(r.id.button1); //stuff mybutton.setonclicklistener(new button.onclicklistener() { @override public void onclick(view v) { if(lastclickedbutton == v){ //stuff return; } //stuff mediaplayer.play(pathaudio1); //play sound when clicked (error) } }); //button2 mybutton = (button) findviewbyid(r.id.button2); //stuff mybutton.setonclicklistener(new button.onclicklistener() { @override public void onclick(view v) { if(lastclickedbutton == v){ //stuff return; } //stuff mediaplayer.play(pathaudio2); //play sound, same problem } }); //goes on more times... } public void login(view v, string right){ //stuff if(right.equals("true")){ //stuff try { assetfiledescriptor descriptor = getassets().openfd("right"); mediaplayer.play(descriptor); //play sound assets intent myintent = new intent(getapplication(), playgame.class); startactivity(myintent); }catch (ioexception e){ } }else{ //stuff try { assetfiledescriptor descriptor = getassets().openfd("wrong"); mediaplayer.play(descriptor); //play sound assets intent myintent = new intent(getapplication(), playgame.class); startactivity(myintent); }catch (ioexception e){ } } } }
the app plays first sound mentioned in comments in code. when click button should start sound following error:
03-16 23:07:38.478 13646-13646/com.example.cello.myownquiz e/androidruntime﹕ fatal exception: main java.lang.illegalstateexception @ android.media.mediaplayer.setdatasource(native method) @ android.media.mediaplayer.setdatasource(mediaplayer.java:1005)
is mediaplayer class okay or missing depending on state? class spot call release or have put somewhere in activity, too?
does see mistake? problem mediaplayer took me whole day of trying, hope can me...
change mp.release();
mp.reset();
public void reset ()
resets mediaplayer uninitialized state. after calling method, have initialize again setting data source , calling prepare().
public void release ()
releases resources associated mediaplayer object. considered practice call method when you're done using mediaplayer. in particular, whenever activity of application paused (its onpause() method called), or stopped (its onstop() method called), this method should invoked release mediaplayer object, unless application has special need keep object around. in addition unnecessary resources (such memory , instances of codecs) being held, failure call method if mediaplayer object no longer needed may lead continuous battery consumption mobile devices, , playback failure other applications if no multiple instances of same codec supported on device. if multiple instances of same codec supported, performance degradation may expected when unnecessary multiple instances used @ same time.
you need keep object around.
anyway can in simple way
meddiaplayer mediaplayer = new mediaplayer(); mediaplayer.setdatasource(context, ringtone); mediaplayer.setaudiostreamtype(audiomanager.stream_media); mediaplayer.prepare(); mediaplayer.start();
Comments
Post a Comment