Disable Android's VideoView requestAudioFocus when playing a video?

前端 未结 5 2205
野的像风
野的像风 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:43

    I got around this with a stupid solution by copying whole source code of android.widget.VideoView of Lollipop and removing line you mentioned.

    Make your own VideoView class. don't use extends VideoView since you can't override openVideo() method.

    I don't recommend this as I thinking it's a temporary solution. VideoView Changed a lot between 4.1-5.0 so this can make RuntimeException on Android version other than Lollipop

    Edit

    I made approach MediaPlayer + SurfaceView as pinxue told us; It respects aspect ratio within viewWidth and viewHeight.

                final String finalFilePath = filePath;
    
                final SurfaceHolder surfaceHolder = sv.getHolder();
                final MediaPlayer mediaPlayer = new MediaPlayer();
                final LinearLayout.LayoutParams svLayoutParams = new LinearLayout.LayoutParams(viewWidth,viewHeight);
                surfaceHolder.addCallback(new SurfaceHolder.Callback(){
    
                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {
    
                        try {
                            if(isDebug) {
                            System.out.println("setting VideoPath to VideoView: "+finalFilePath);
                            }
                            mediaPlayer.setDataSource(finalFilePath);
                        }catch (IOException ioe){
                            if(isDebug){
                                ioe.printStackTrace();
                            }
                            //mediaPlayer = null;
                        }
                        mediaPlayer.setDisplay(surfaceHolder);
                        mediaPlayer.prepareAsync();
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                if(isDebug){
                                    System.out.println("Video is starting...");
                                }
    
                                // for compatibility, we adjust size based on aspect ratio
                                if ( mp.getVideoWidth() * svLayoutParams.height  < svLayoutParams.width * mp.getVideoHeight() ) {
                                    //Log.i("@@@", "image too wide, correcting");
                                    svLayoutParams.width = svLayoutParams.height * mp.getVideoWidth() / mp.getVideoHeight();
                                } else if ( mp.getVideoWidth() * svLayoutParams.height  > svLayoutParams.width * mp.getVideoHeight() ) {
                                    //Log.i("@@@", "image too tall, correcting");
                                    svLayoutParams.height = svLayoutParams.width * mp.getVideoHeight() / mp.getVideoWidth();
                                }
                                sv.post(new Runnable(){
                                        @Override
                                        public void run() {
                                            sv.setLayoutParams(svLayoutParams);
                                        }
                                    });
    
    
                                mp.start();
                            }
                        });
                    }
    
                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                        if(isDebug){
                            System.out.println("surfaceChanged(holder, "+format+", "+width+", "+height+")");
                        }
                    }
    
                    @Override
                    public void surfaceDestroyed(SurfaceHolder holder) {
                        try {
                            mediaPlayer.setDataSource("");
                        }catch (IOException ioe){
                            if(isDebug){
                                ioe.printStackTrace();
                            }
                        }
                    }
                });
    
                if(sv.post(new Runnable() {
                    @Override
                    public void run() {
    
                        sv.setLayoutParams(svLayoutParams);///
                        sv.setVisibility(View.VISIBLE);
    
                    }})){
    
                    if(isDebug) {
                        System.out.println("post Succeded");
                    }
                }else{
                    if(isDebug) {
                        System.out.println("post Failed");
                    }
                }
    

提交回复
热议问题