How to prevent VideoView/MediaPlayer from stopping other apps' audio?

后端 未结 3 521
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-06 07:13

In one screen I have a looping background video (upon which normal UI elements are shown), implemented with VideoView like this:

String resPath = \"android.         


        
相关标签:
3条回答
  • 2020-12-06 07:24

    The accepted solution does not guarantee compatibility across all Android versions and is a dirty hack more than a true solution. I've tried all forms of hacks to get this working, yet none have worked to my satisfaction.

    I have come up with a much better solution though - switch from a VideoView to a TextureView and load it with a MediaPlayer. There is no difference from the user's perspective, just no more audio stoppage.

    Here's my use case for playing an MP4 looping:

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-06 07:31

    This worked for me:

    videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
    

    (before .setVideUri() call)

    0 讨论(0)
  • 2020-12-06 07:45

    Copy paste VideoView from Android sources and comment out these lines:

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

    You could name the new class MutedVideoView, for example.

    gist here: https://gist.github.com/vishna/7e9d3466bced8502fcdd

    0 讨论(0)
提交回复
热议问题