首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android VideoView/MediaPlayer 自動播放:在 onResume 之前完成初始化是關鍵

     編輯:程式設計綜合問答

空指針根因

在 `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(); // 釋放資源
    }
}

關鍵點總結

  • 初始化在 onCreate:`setVideoPath` 觸發異步準備。
  • 自動播放在 OnPreparedListener:確保引擎就緒。
  • onResume 僅做恢復播放:防止 Home 鍵切回後不自動播放。
  • onPause 暫停、onDestroy 釋放:避免內存洩漏、聲音殘留。

進階:ExoPlayer 替代方案

官方推薦 Media3 ExoPlayer,支持自適應碼率、緩存、DRM、畫中畫,API 更現代:

ExoPlayer player = new ExoPlayer.Builder(this).build();
playerView.setPlayer(player);
player.setMediaItem(MediaItem.fromUri(uri));
player.setPlayWhenReady(true); // 自動播放
player.prepare();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved