My guess is to use just stop() without checking for isPlaying. And instead of recreating mediaPlayer on each button press call stop() and prepare().
On Jun 15, 7:38 pm, "Jeff B." <[email protected]> wrote: > To avoid any confusion, I don't know if I made it clear that the code > I have listed is currently working. I'm just not sure of why I am > needing the IllegalStateException logic. > > Thanks, > Jeff > > On Jun 12, 12:39 am, "Jeff B." <[email protected]> wrote: > > > > > Hello, > > > I have an ImageButton that plays a sound whenever it is held down and > > stops as soon as you let up. To do this I register an onTouch handler > > and operate on ACTION_DOWN and ACTION_UP MotionEvents. The code is > > below. The idea is that when the ACTION_UP comes in I first call > > stop() and then I re-prepare the sound so that it is all ready for the > > next start() in a subsequent ACTION_DOWN. I do this instead of start/ > > pause because I need the sound to start from the beginning each time > > and the seekTo() call is asynch which seemed to complicated the > > logic. The problem I'm having is that every now and then if I'm > > really "beating" on the button (i.e. clicking it rapidly and for > > different durations) I will hit the illegal state exception. The > > debugger log shows that I am in MEDIA_PLAYER_PLAYBACK_COMPLETE (128) > > when trying to call prepare(). As you can see below, I only try to > > call prepare after I have called stop. So this would imply that stop > > is somehow either asynchronous or the two operations are being allowed > > to happen in an overlapped fashion. > > > So two questions: 1) does anyone have an explanation for what I'm > > seeing? 2) is there a better/cleaner way to do what I'm trying to do > > in general? This is my first android app so it's very possible I'm > > missing the boat on something. > > > public void onCreate(Bundle savedInstanceState) { > > > super.onCreate(savedInstanceState); > > setContentView(R.layout.main); > > > Context appCtx = getApplicationContext(); > > > // button init code removed > > > mSoundBeep = MediaPlayer.create(appCtx, R.raw.beep); > > > mImgBtnBeep.setOnTouchListener(new OnTouchListener() { > > public boolean onTouch(View v, MotionEvent event) { > > > switch (event.getAction()) { > > case MotionEvent.ACTION_DOWN: > > mSoundBeep.start(); > > break; > > > case MotionEvent.ACTION_UP: > > if (mSoundBeep.isPlaying()) { > > mSoundBeep.stop(); > > try { > > mSoundBeep.prepare(); > > } catch (IllegalStateException e) { > > mSoundBeep.release(); > > Context appCtx = getApplicationContext(); > > mSoundBeep = MediaPlayer.create(appCtx, R.raw.beep); > > } catch (IOException e) { > > // TODO Auto-generated catch block > > e.printStackTrace(); > > } > > } > > break; > > } > > > return false; > > } > > > });- Hide quoted text - > > > - Show quoted text - -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

