您应该使用 TextureView 进行显示,并使用 mediaPlayer.setSurface 而不是 mediaPlayer.setDisplay。
从 Activity A 调用简单的 Activity B 并传递视频位置参数。在活动 B 中 - 当表面可用时,将其设置到 MediaPlayer 并点击开始。
我看不出它有任何失败的原因,除非您丢失的媒体播放器发生了一些事情。
是的,Android 很糟糕(不仅在处理视频方面)。
这是我的 VideoFullScreenActivity 代码
public class FullScreenVideoActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {
private EventBus bus = EventBus.getDefault();
private CustomVideoView mAdapterVideoPlayer;
private TextureView mFullScreenTextureView;
private RelativeLayout container;
private boolean mIsPortrait;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_full_screen_video);
container = (RelativeLayout) findViewById(R.id.container);
mFullScreenTextureView = (TextureView) findViewById(R.id.fullscreen_texture_surface);
mFullScreenTextureView.setSurfaceTextureListener(this);
}
@Override
protected void onResume() {
super.onResume();
if (!bus.isRegistered(this))
bus.register(this);
}
@Override
protected void onStop() {
super.onStop();
if (bus.isRegistered(this))
bus.unregister(this);
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (mAdapterVideoPlayer != null)
mAdapterVideoPlayer.setSeekPosition(PiplMediaPlayer.getInstance().getCurrentPosition());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void fullscreen(VideFullscreenParams videFullscreenParams) {
this.mAdapterVideoPlayer = videFullscreenParams.customVideoView;
mIsPortrait = videFullscreenParams.customVideoView.getWidth() < videFullscreenParams.customVideoView.getHeight();
if (mIsPortrait)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
CustomMediaPlayer.getInstance().changeSurface(new Surface(surface));
CustomMediaPlayer.getInstance().prepareController(container);
CustomMediaPlayer.getInstance().setControllerTouchView(mFullScreenTextureView);
CustomMediaPlayer.getInstance().start();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
public static class VideFullscreenParams {
private final CustomVideoView customVideoView;
public VideFullscreenParams(CustomVideoView customVideoView) {
this.customVideoView = customVideoView;
}
}
}
如您所见,我还使用了一个名为 CustomMediaPlayer 的类。这是一个封装 MediaPlayer 并在整个应用程序中管理其生命周期的单例。如果您在 RecyclerView 或 LinearLayout 中加载多个视频,这是必须的。