0

I just finished to play a sound when press button

but I have a short sound like "beep" which shorter than 1s

how can I press down the button to play the sound until button up?

    bt = (Button)findViewById(R.id.clickme);
    final MediaPlayer mp = MediaPlayer.create(this, R.raw.beep);
    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mp.start();
        }
    });
Surya Prakash Kushawah
  • 3,185
  • 1
  • 22
  • 42
Hoko MaJi
  • 21
  • 3

2 Answers2

0

Use OnTouchListener

bt.setOnTouchListener(new View.OnTouchListener() {        
@Override
public boolean onTouch(View v, MotionEvent event) {
    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN: // Button Pressed    
            mp.reset();
            mp.setDataSource(mediapath);
            mp.prepare();
            mp.start();        

            return true; 
        case MotionEvent.ACTION_UP:// Button released
            mp.stop();
            return true; 
    }
    return false;
}
});
sasikumar
  • 12,540
  • 3
  • 28
  • 48
0

you can use the following code:

bt.setOnTouchListener(this);

@Override
public boolean onTouch(View arg0, MotionEvent event) {

    switch (event.getAction() ) { 
    case MotionEvent.ACTION_DOWN: 
        System.out.println("touch");
        mp.setLooping(true);
        mp.start();
        break;
    case MotionEvent.ACTION_UP:
        System.out.println("up");
        mp.pause();
        break; 
    }

    return true;
}

i have done some research and found that Android Mediaplayer has a problem playing gapless sound while looping..

see this: Gapless Playback with android MediaPlayer

i also find couple of solution:

  1. use ogg format sound file (https://en.wikipedia.org/wiki/.ogg)
  2. Can use soundpool it has a looping and caching facility for media play (https://developer.android.com/reference/android/media/SoundPool.html)

Also you can use the following class: see if it works..

    public class LoopMediaPlayer {

    public static final String TAG = LoopMediaPlayer.class.getSimpleName();

    private Context mContext = null;
    private int mResId = 0;
    private int mCounter = 1;

    private MediaPlayer mCurrentPlayer = null;
    private MediaPlayer mNextPlayer = null;

    public static LoopMediaPlayer create(Context context, int resId) {
        return new LoopMediaPlayer(context, resId);
    }

    private LoopMediaPlayer(Context context, int resId) {
        mContext = context;
        mResId = resId;

        mCurrentPlayer = MediaPlayer.create(mContext, mResId);
        mCurrentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mCurrentPlayer.start();
            }
        });

        createNextMediaPlayer();
    }

    private void createNextMediaPlayer() {
        mNextPlayer = MediaPlayer.create(mContext, mResId);
        mCurrentPlayer.setNextMediaPlayer(mNextPlayer);
        mCurrentPlayer.setOnCompletionListener(onCompletionListener);
    }

    private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            mediaPlayer.release();
            mCurrentPlayer = mNextPlayer;

            createNextMediaPlayer();

            Log.d(TAG, String.format("Loop #%d", ++mCounter));
        }
    };
}

to use it just call

LoopMediaPlayer.create(context, R.raw.sound_file_name);

intead of mp.setLooping(true);

Community
  • 1
  • 1
rafsanahmad007
  • 23,683
  • 6
  • 47
  • 62