如何防止VideoView/MediaPlayer停止其他应用程序的音频?

问题描述 投票:0回答:5

在一个屏幕中,我有一个循环背景视频(在其上显示正常的 UI 元素),使用 VideoView 实现,如下所示:

String resPath = "android.resource://" + getPackageName() + "/" + R.raw.bg_video;
videoView.setVideoURI(Uri.parse(resPath));

// Hide controls:
MediaController controller = new MediaController(getActivity());
controller.setVisibility(View.GONE);
videoView.setMediaController(controller);

// Use looping:
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});

videoView.start();

视频效果很棒。唯一的问题是,当显示此视图时(或者甚至在使用 ViewPager 之前),其他应用程序的音乐播放会停止

我使用的视频本身没有声音。有没有办法将 VideoView 或其使用的 MediaPlayer 设置为“静音模式”?也就是说,告诉它根本不要播放音频,尤其是不要干扰其他应用程序的音频

mp.setVolume(0, 0);
中尝试了
onPrepared()
,但没有效果。

android audio android-mediaplayer android-videoview
5个回答
15
投票

从 Android 源代码复制粘贴

VideoView
并注释掉这些行:

AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

例如,您可以将新类命名为

MutedVideoView

要点:https://gist.github.com/vishna/7e9d3466bced8502fcdd


10
投票

接受的解决方案并不能保证所有 Android 版本的兼容性,而且是一种肮脏的黑客行为,而不是真正的解决方案。 我已经尝试了各种形式的技巧来使其正常工作,但没有一个能让我满意。

我想出了一个更好的解决方案 - 从

VideoView
切换到
TextureView
并用
MediaPlayer
加载它。 从用户的角度来看没有什么区别,只是不再有音频中断。

这是我播放 MP4 循环的用例:

private TextureView _introVideoTextureView;
private MediaPlayer _introMediaPlayer;

...

@Override
public void onCreate(...) {
    _introVideoTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
           try {
               destoryIntroVideo();

               _introMediaPlayer = MediaPlayer.create(SignInActivity.this, R.raw.intro_video);
               _introMediaPlayer.setSurface(new Surface(surfaceTexture));
               _introMediaPlayer.setLooping(true);
               _introMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
               _introMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });

            } catch (Exception e) {
                System.err.println("Error playing intro video: " + e.getMessage());
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {}

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
    });
}

@Override
public void onDestroy() {
    super.onDestroy();

    destoryIntroVideo();
}

private void destoryIntroVideo() {
    if (_introMediaPlayer != null) {
        _introMediaPlayer.stop();
        _introMediaPlayer.release();
        _introMediaPlayer = null;
    }
}

6
投票

这对我有用:

videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);

(在

.setVideUri()
通话之前)


0
投票

有一个适用于 API 级别 26 及更高级别的解决方案。这是 Kotlin 保持视频静音的方式。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            binding.viewView2.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE)
        }

0
投票

我在 Android Auto 应用程序中遇到了完全相同的问题,该应用程序读取没有声音的视频文件。 播放视频会停止汽车的音频(收音机、蓝牙......)。

在设置文件路径之前添加

videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE)
修复了它。

谢谢阿尔瓦罗和斯蒂芬!!

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.