大家好,如何在React Native Home Button Pressed上实现PiP(画中画)视频?我无法在Rea



当我按下android home键时,通过原生模块播放pip视频,并将视频url和当前视频持续时间传递给原生模块,并接受该参数和意图给视频活动。在视频活动OnCreate方法中,我尝试显示PiP视频。当我在react native中按下图标时,显示PiP模式,但我无法返回到react native视图。当我按Android Home键时,PiP模式无法显示

PiPModule.java

public class PiPModule extends ReactContextBaseJavaModule {
public PiPModule(ReactApplicationContext reactContext){
super(reactContext);
}
@NonNull
@Override
public String getName() {
return "PiPModule";
}
@ReactMethod
public void showPiPVideo(String videoURL,int seekToDuration)
{
Toast.makeText(getReactApplicationContext(),"showPiPVideo is working",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getCurrentActivity(), PiPVideoActivity.class);
intent.putExtra("VIDEO_URL",videoURL);
intent.putExtra("VIDEO_CURRENT_DURATION",seekToDuration);
getCurrentActivity().startActivity(intent);
}

}

在React-Native组件中的使用

import {NativeModules} from 'react-native'
const pipVideo = NativeModules.PiPModule;
pipVideo.showPiPVideo(videoURL, Math.floor(currentTime) * 1000);
<<p>PiPVideo活动/strong>
public class PiPVideoActivity extends AppCompatActivity {
private String videoPath;
private int videoDuration;
VideoView myVideoView;
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pip_video);
Intent i = getIntent();
if(i != null){
myVideoView = (VideoView) findViewById(R.id.videoView);
videoPath = i.getStringExtra("VIDEO_URL");
videoDuration = i.getIntExtra("VIDEO_CURRENT_DURATION",0);
PlayVideo();
}
else{
Toast.makeText(PiPVideoActivity.this, "VideoURL not found", Toast.LENGTH_SHORT).show();
}
PictureInPictureParams params = new PictureInPictureParams
.Builder()
.setAspectRatio(new Rational(1,1))
.build();
enterPictureInPictureMode(params);
}
private void PlayVideo() {
try {
getWindow().setFormat(PixelFormat.TRANSLUCENT);
Uri video = Uri.parse(videoPath);
myVideoView.setVideoURI(video);
myVideoView.requestFocus();
myVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
//seek to receive miliseconds
myVideoView.seekTo(videoDuration);
myVideoView.start();
}
});
} catch (Exception e) {
System.out.println("Video Play Error :" + e.toString());
finish();
}
}

}

你可以通过编写一些本地模块在react native中实现Picture in Picture

Android原生模块:

package com.rnchallenge;
import android.app.PictureInPictureParams;
import android.os.Build;
import android.util.Rational;
import android.widget.Toast;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
public class PipModule extends ReactContextBaseJavaModule {
private Rational aspectRatio;
PipModule(ReactApplicationContext context){
super(context);
aspectRatio = new Rational(4,3);
}
@Override
public String getName(){
return "PipModule";
}
@ReactMethod
public void EnterPipMode(){
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
PictureInPictureParams params = new PictureInPictureParams.Builder().setAspectRatio(this.aspectRatio).build();
getCurrentActivity().enterPictureInPictureMode(params);
}
}
}

最新更新