Search code examples
androidmedia-player

MediaPlayer not working properly (Android)?


I am trying to make a simple soundboard in android. I am almost done with the hard part, however there still is one problem I need to solve before I can finish the app.

I created a nested switch statement that recognizes an ImageView by it's id, inside that switch statement (so let's say "case R.id.prank") I tell the app what to do when you press the ImageView, the action is up and when the action is down.

now I don't have any problems with the ImageViews or anything, I think it has something to do with the mediaplayer, but i'm not 100% sure. Basically what happens when I press the first ImageView, the first and second sound play. When I press the second button, only the second sound get's played.

I want the first ImageView to play the first sound and the second ImageView to play the second sound. Anyone know what I'm doing wrong?

public class MainActivity extends AppCompatActivity implements OnTouchListener {
ImageView bmw_image;
ImageView prank;
MediaPlayer bmw_mp, prank_mp;
int bmw_id;
int prank_id;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    prank = (ImageView) findViewById(R.id.prank);
    bmw_image = (ImageView) findViewById(R.id.bmw_image);

    bmw_mp = MediaPlayer.create(this, R.raw.dikke_bmw_jongens_cut);
    prank_mp = MediaPlayer.create (this, R.raw.prank_cut);

    bmw_image.setOnTouchListener(this);
    prank.setOnTouchListener(this);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (v.getId()) {
        case R.id.bmw_image:

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {

                    bmw_mp.start();
                    ImageView view = (ImageView) v;

                    view.getDrawable().setColorFilter(0xff777777, PorterDuff.Mode.MULTIPLY);
                    view.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP:

                case MotionEvent.ACTION_CANCEL: {
                    ImageView view = (ImageView) v;
                    view.getDrawable().clearColorFilter();
                    view.invalidate();
                    break;
                }               
            }
                case R.id.prank:

                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN: {
                         prank_mp.start();
                            ImageView view = (ImageView) v;

                            //overlay is black with transparency of 0x77 (119)
                            view.getDrawable().setColorFilter(0xff777777, PorterDuff.Mode.MULTIPLY);
                            view.invalidate();
                            break;
                        }
                        case MotionEvent.ACTION_UP:

                        case MotionEvent.ACTION_CANCEL:
                        {
                            ImageView view = (ImageView) v;
                            view.getDrawable().clearColorFilter();
                            view.invalidate();
                            break;
                }
            }
            break;
    }

    return true;
    }
}

Solution

  • You forget to write break for first case so after first sound second will play too .

    public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
    ImageView bmw_image;
    ImageView prank;
    MediaPlayer bmw_mp, prank_mp;
    int bmw_id;
    int prank_id;
    
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        prank = (ImageView) findViewById(R.id.prank);
        bmw_image = (ImageView) findViewById(R.id.bmw_image);
    
        bmw_mp = MediaPlayer.create(this, R.raw.dikke_bmw_jongens_cut);
        prank_mp = MediaPlayer.create(this, R.raw.prank_cut);
    
        bmw_image.setOnTouchListener(this);
        prank.setOnTouchListener(this);
    }
    
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (v.getId()) {
            case R.id.bmw_image: {
    
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: {
    
                        bmw_mp.start();
                        ImageView view = (ImageView) v;
    
                        view.getDrawable().setColorFilter(0xff777777, PorterDuff.Mode.MULTIPLY);
                        view.invalidate();
                        break;
                    }
                    case MotionEvent.ACTION_UP:
    
                    case MotionEvent.ACTION_CANCEL: {
                        ImageView view = (ImageView) v;
                        view.getDrawable().clearColorFilter();
                        view.invalidate();
                        break;
                    }
                }
                break;
            }
            case R.id.prank: {
    
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: {
                        prank_mp.start();
                        ImageView view = (ImageView) v;
    
                        //overlay is black with transparency of 0x77 (119)
                        view.getDrawable().setColorFilter(0xff777777, PorterDuff.Mode.MULTIPLY);
                        view.invalidate();
                        break;
                    }
                    case MotionEvent.ACTION_UP:
    
                    case MotionEvent.ACTION_CANCEL: {
                        ImageView view = (ImageView) v;
                        view.getDrawable().clearColorFilter();
                        view.invalidate();
                        break;
                    }
                }
                break;
            }
        }
        return true;
    }
    }