java - 使用按钮切换 VideoView 的音频

标签 java android audio

我正在使用 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. 当我释放按钮时,音频必须取消静音。

我做了很多尝试,但都以某种方式失败了。请帮忙。

最佳答案

你的意思是:

  1. The first time I hold the button, the video should play.
  2. While I'm holding the button the audio must be heard.
  3. When I release the button, the audio must be muted.
  4. When I press and hold the button again, the audio must be heard again.

那么您需要的不是 OnClickListener 而是 OnTouchListener

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

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

这是一个示例 fragment :

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,然后调整其音量。

编辑:

这是另一个示例 fragment :

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 完全准备好之前,这些应该放置在 fragment 的 onViewCreated() 或 Activity 的 onCreate() 方法上.

关于java - 使用按钮切换 VideoView 的音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30448525/

相关文章:

android - 减少API失败

android - 数据绑定(bind)中的开关盒

java - 如何在 RecyclerView 中为自定义 View 使用 setter?

Android 使用自定义编码器录制音频

ios - 无法在Xcode项目中播放音频

java - MissingMethodException - org.neo4j.kernel.impl.coreapi.schema.IndexDefinitionImpl.createNode() - Groovy

java - 是否有基于非 Id 字段合并的 JPA 功能?

java - 使用 LWJGL 创建相机类

amazon-web-services - 通过 MediaLive 服务器进行音频流式传输

java - 使用 java rx.Observable 进行并行 API 调用