Disable Android's VideoView requestAudioFocus when playing a video?

前端 未结 5 2138
野的像风
野的像风 2021-02-13 06:04

I\'m building an app that records and plays back video. I would like to do so without affecting background music playback, i.e. if I begin playing a video, I do not want to paus

5条回答
  •  野的像风
    2021-02-13 06:47

    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;
        }
    }
    

提交回复
热议问题