Android - 在按钮单击时取消静音 VideoView

Posted

技术标签:

【中文标题】Android - 在按钮单击时取消静音 VideoView【英文标题】:Android - Unmute VideoView on Button Click 【发布时间】:2018-02-02 09:20:39 【问题描述】:

我实际上正在设置一个简单的 videoView,当活动开始时会静音(声音),然后可以通过按下按钮激活声音。

我不想使用 AudioManager,而是使用媒体播放器。我还没有发现我做错了什么。寻求帮助。

我的代码实际上是在 Kotlin 中,但我相信即使是 java 解决方案也会对我有所帮助。

这是我的代码:

import android.net.Uri
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.VideoView
import android.util.DisplayMetrics
import android.media.MediaPlayer.OnPreparedListener
import android.widget.ImageButton
import android.widget.TextView

class AboutActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_about)
        supportActionBar?.setDisplayHomeAsUpEnabled(true) /*show back button*/

        /*Display video*/
        val video = findViewById<VideoView>(R.id.coverVideo)
        video.setVideoPath(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.cover).toString());
        video.start() /*Start video automatically*/

        //Get screen size
        val displaymetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(displaymetrics)

        val width = displaymetrics.widthPixels //get width
        val video_height = 9 * width / 16 //calculate height for 16:9 format

        //Set video height
        val params = video.getLayoutParams()
        params.width = width
        params.height = video_height
        video.setLayoutParams(params)

        video.setOnPreparedListener(
            mp -> mp.isLooping = true; //Make it loop
            mp.setVolume(0f, 0f); //Mute
        )

        val speaker = findViewById<ImageButton>(R.id.speaker)
        speaker.setOnClickListener  speakerPressed(video) 
    

    override fun onBackPressed() 
        super.onBackPressed()
        overridePendingTransition(R.anim.hold, R.anim.fade_out)
    


    fun speakerPressed(v: Any)
        val v = findViewById<VideoView>(R.id.coverVideo)
        v.setOnPreparedListener(
            mp -> mp.setVolume(1.0f, 1.0f); //Unmute
        )
        val VideoView = findViewById<TextView>(R.id.textView6)
        VideoView.text = "ButtonPressed" //Checking if the click setup works
    

【问题讨论】:

可能是重复问题here 嗨,谢谢你的回答,我已经看过那个帖子了,不幸的是,由于某种原因,那里的答案对我不起作用 你检查过(通过调试器)speakerPressed 方法是否被调用过?还要检查 lambda 中的 mp 是什么,以确保您正在修改正确的对象。 我确实检查了speakerPressed,它被调用了。我实际上是在尝试寻找一种不同的方式来设置 mediaPlayer,这可能是问题所在。 【参考方案1】:

据我了解,您只是想通过一个按钮将音量静音和取消静音。就我而言,我自己使用自定义按钮做了一些非常相似的事情,因为我不希望整个笨重的媒体播放器位于 videoView 的底部。设置 MediaController 和 setOnPreparedListener 后,我使用 MediaPlayer 将音量设置为 0 mc.setVolume(0F, 0F) 并将音量设置回用户允许的最大 mc.setVolume(1F, 1F)

在您的代码中,我没有看到您将 mediaController 分配给 videoView,如下面的所示。之后,我只是 setVisibility(View.GONE)。没有 MediaController,我根本没有音量

private static final String TAG = IntroMovieActivity.class.getSimpleName();
private boolean mVolumePlaying = true;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_intro_movie);

    mVideoView = this.findViewById(R.id.videoView);

    Uri uri = Uri.parse("android.resource://"+ this.getPackageName()+"/raw/"+"intro");

    MediaController mc = new MediaController(this);
    mVideoView.setMediaController(mc);
    mVideoView.setOnPreparedListener(mp -> setVolumeControl(mp));
    mVideoView.setVideoURI(uri);
    mVideoView.setOnCompletionListener(mp -> mVideoView.start());

    mc.setVisibility(GONE);

private void setVolumeControl(MediaPlayer mp) 
    AppCompatImageView volume = findViewById(R.id.volume);
    volume.setOnClickListener(v -> 
        if(mVolumePlaying) 
            Log.d(TAG, "setVolume OFF");
            volume.setImageResource(R.drawable.ic_volume_off_black_36_dp_80alpha);
            mp.setVolume(0F, 0F);
         else 
            Log.d(TAG, "setVolume ON");
            volume.setImageResource(R.drawable.ic_volume_up_black_36dp_80alpha);
            mp.setVolume(1F, 1F);
        
        mVolumePlaying = !mVolumePlaying;
    );

【讨论】:

以上是关于Android - 在按钮单击时取消静音 VideoView的主要内容,如果未能解决你的问题,请参考以下文章

检测静音|在 Android TV 上取消静音

Swift 3:如何在使用 AVFoundation 录制视频期间将麦克风静音/取消静音

想要为全屏视频背景上的音频创建自定义静音/取消静音按钮

如何快速制作静音和取消静音按钮?

Objective-C:在 iOS 上使用 AVFoundation 录制视频时静音/取消静音

VideoJS 播放器自定义静音/取消静音切换