在 `onStart`/`onResume` 調用 `start()` 時,`MediaPlayer`/`VideoView` **尚未完成準備**(`OnPreparedListener` 未回調),內部播放引擎對象為 null。
public class VideoActivity extends AppCompatActivity {
private VideoView videoView;
private boolean isPrepared = false;
private boolean shouldAutoPlay = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
videoView = findViewById(R.id.videoView);
videoView.setOnPreparedListener(mp -> {
isPrepared = true;
if (shouldAutoPlay) {
videoView.start();
shouldAutoPlay = false;
}
});
videoView.setVideoPath("android.resource://" + getPackageName() + "/" + R.raw.demo);
// 或 setVideoURI(Uri.parse("https://..."));
}
@Override
protected void onResume() {
super.onResume();
if (isPrepared && !videoView.isPlaying()) {
videoView.start();
}
}
@Override
protected void onPause() {
super.onPause();
if (videoView.isPlaying()) {
videoView.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
videoView.stopPlayback(); // 釋放資源
}
}
官方推薦 Media3 ExoPlayer,支持自適應碼率、緩存、DRM、畫中畫,API 更現代:
ExoPlayer player = new ExoPlayer.Builder(this).build();
playerView.setPlayer(player);
player.setMediaItem(MediaItem.fromUri(uri));
player.setPlayWhenReady(true); // 自動播放
player.prepare();