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

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

[C++][SFML 2.2] Strange Performance Issues - Moving Mouse Lowers CPU Usage -

ios - Possible to get UIButton sizeThatFits to work? -