【问题标题】:Toggle VideoView's audio with a Button使用按钮切换 VideoView 的音频
【发布时间】:2025-12-01 01:25:04
【问题描述】:

我正在使用 videoView 播放视频。

 bVideoView = (VideoView) findViewById(R.id.bVideoView);
 bVideoView.setVideoPath(videoPath);

现在我有了一个按钮,

audioToggle = (Button) findViewById(R.id.audioToggle);

然后我有按钮的OnClickListener

private static int aux = 0;
private AudioManager mAudioManager;

 audioToggle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                bVideoView.start();

                mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

                if(aux % 2 == 0){

                    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 50, 0);
                    aux++;

                } else {

                    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
                    aux++;

                }
            }
        });

现在有了这个OnClickListener,我完全能够在每次单击时将音频切换为静音和取消静音。但是我想要这样的东西,

  1. 第一次单击时,videoView 应该会启动。
  2. 当我一直按下按钮时,音频必须静音。
  3. 当我松开按钮时,音频必须取消静音。

我一直在尝试很多,但以某种或其他方式失败了。请帮忙。

【问题讨论】:

    标签: java android audio


    【解决方案1】:

    你的意思是:

    1. 第一次按住按钮时,视频应该会播放。
    2. 当我按住按钮时,必须听到音频。
    3. 当我释放按钮时,音频必须静音。
    4. 当我再次按住按钮时,必须再次听到音频。

    那么你需要的不是OnClickListener,而是OnTouchListener

    幕后发生的事情是,您的OnClickListener 总是在您松开手指后被调用。使用View.OnTouchListener,您可以在按下(您的意思是触摸并按住)并释放时调度事件。

    http://developer.android.com/reference/android/view/View.OnTouchListener.html

    这是一个示例 sn-p:

    private static int aux = 0;
    private AudioManager mAudioManager;
    
    audioToggle.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent e) {
    
            bVideoView.start();
    
            mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
            switch(e.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 50, 0);
                    break;
                case MotionEvent.ACTION_UP:
                    mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
                    break;
            }
            return true;
        }
    }
    


    最后,我不建议控制系统的音量。请改用MediaPlayer.OnPreparedListener,获取VideoViewMediaPlayer,然后调整它的音量。

    编辑:

    这是另一个示例 sn-p:

    private MediaPlayer bVideoViewMP;
    
    
    bVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            // Fetch a reference
            bVideoViewMP = mp;
        }
    });
    
    audioToggle.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent e) {
    
            bVideoView.start();
    
            switch(e.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    bVideoViewMP.setVolume(0.75f, 0.75f);
                    break;
                case MotionEvent.ACTION_UP:
                    bVideoViewMP.setVolume(0, 0);
                    break;
            }
            return true;
        }
    }
    

    在完全准备好VideoView 之前,这些应该放在片段的onViewCreated() 或活动的onCreate() 方法上。

    【讨论】:

    • 是的,我也是这样,你能建议我怎么做吗?