1

I want to implement a mute button for a video view. I have written the code below but it looks like the code inside onPrepared() doesn't get executed. The listener seems to be working though.

I am not sure what the issue with this code is.

Also, if there is a way of implementing a built in mute button, I am open to suggestions. But I could not find anything of that sort.

Code below:

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
        final int volume_level = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        videoFile = getResources().getIdentifier("video", "raw", getApplicationContext().getPackageName());
        videoView = (VideoView) findViewById(R.id.video);
        mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);
        mediaController = new MediaController(this, false);
        videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/"
                + videoFile));
        videoView.start();
        ImageButton mute = (ImageButton) findViewById(R.id.mute);
        mute.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Set Volume
                if (volume_level != 0) {
                    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            if (mp.isPlaying()) {
                                mp.stop();
                                mp.release();
                                mp = new MediaPlayer();
                            }
                            mp.setVolume(0, 0);
                            mp.start();
                        }
                    });
                } else {
                    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            if (mp.isPlaying()) {
                                mp.stop();
                                mp.release();
                                mp = new MediaPlayer();
                            }
                            mp.setVolume(volume_level, volume_level);
                            mp.start();
                        }
                    });
                }

            }
        });

Regards,

hirani89
  • 156
  • 1
  • 2
  • 13

1 Answers1

0

I'm pretty sure you are starting video view before applying the listeners, try following rearranged code.

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
    final int volume_level = am.getStreamVolume(AudioManager.STREAM_MUSIC);
    videoFile = getResources().getIdentifier("video", "raw", getApplicationContext().getPackageName());
    videoView = (VideoView) findViewById(R.id.video);
    mediaController = new MediaController(this);
    mediaController.setAnchorView(videoView);
    videoView.setMediaController(mediaController);
    mediaController = new MediaController(this, false);
    videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/"
            + videoFile));

    ImageButton mute = (ImageButton) findViewById(R.id.mute);
    mute.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Set Volume
            if (volume_level != 0) {
                videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        if (mp.isPlaying()) {
                            mp.stop();
                            mp.release();
                            mp = new MediaPlayer();
                        }
                        mp.setVolume(0, 0);
                        mp.start();
                    }
                });
            } else {
                videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        if (mp.isPlaying()) {
                            mp.stop();
                            mp.release();
                            mp = new MediaPlayer();
                        }
                        mp.setVolume(volume_level, volume_level);
                        mp.start();
                    }
                });
            }

        }
    });
videoView.start(); // start the video after setting up the listener.

I'm positive this is the main reason why onPrepared callback not executed.

Nakul
  • 1,313
  • 19
  • 26
  • I tried the code you provided. It did not work. Do you have any other suggestions? – hirani89 Jul 12 '18 at 05:43
  • what was the behavior ? – Nakul Jul 12 '18 at 05:53
  • I think I figured out the problem but no solution. `videoView.setOnPreparedListener` is being set `onClick` and not before the video starts like you mentioned. I need to set PreparedListener outside `mute.onClick` and some be able to alter volume `onClick1` – hirani89 Jul 17 '18 at 04:24