'Changing audio source for media player (Android Studio)

I am trying to create a button that plays a sound at random from the list of sounds on click. The code I have randomises the first sound, but the subsequent clicks do not trigger any sound. Do I have to release codec after the sound plays?

meow.setOnClickListener((view) ->{
            Random random = new Random();
            int r = random.nextInt(6-1) + 1;
            Toast.makeText(MainActivity.this,Integer.valueOf(r).toString(),Toast.LENGTH_SHORT).show();
            try{
                if(r==1)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat1);
                else if (r==2)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat2);
                else if (r==3)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat3);
                else if (r==4)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat4);
                else
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat5);
                mp.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
                mp.prepare();
                mp.start();
            }catch(Exception e){e.printStackTrace();}
        });


Solution 1:[1]

you should check state of player, pause/stop if is active and call mp.release(); before loading next song into

with second and further clicks you have probably some Exception log produced by e.printStackTrace();, check it out, will tell you what is wrong

also make use of create method, which will load your R.raw file and return new instance of MediaPlayer. before doing that release previous player instance if exists

if (mp!=null) mp.release(); // maybe needs also a  check if playing and stop before?
mp = MediaPlayer.create(view.getContext(), R.raw.meowcat100);
mp.start(); // dont have to call prepare in this case

Solution 2:[2]

call mp.reset() before setting new data source

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 m'hd semps