Exoplayer未加载视频源时点击设置白屏闪退问题如何解决
问题根因
你遇到的崩溃本质是:ExoPlayer的DefaultTrackSelector需要等视频源的媒体元数据加载完成后,才会生成可用的MappingTrackSelector.MappedTrackInfo实例。在未加载完成前直接调用TrackSelectionDialog.createForTrackSelector,方法内部访问空的MappedTrackInfo会抛出未捕获的运行时异常,最终导致APP闪退,表现为白屏后返回首页。
修复方案
1. 点击事件增加状态校验(必须修改)
在触发画质选择弹窗之前,先校验TrackSelector是否已经完成初始化、是否有可用的轨道信息,同时校验ExoPlayer当前状态合法。修改后的点击事件代码如下:
imgAudio.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 先校验核心对象非空,且player未处于未初始化的空闲状态 if (trackSelector == null || player == null || player.getPlaybackState() == Player.STATE_IDLE) { // 可在此处加Toast提示用户"视频正在加载中,请稍后操作" return; } try { MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); // 校验轨道信息非空 if (mappedTrackInfo == null) { // 同样可加操作提示 return; } DefaultTrackSelector.Parameters parameters = trackSelector.getParameters(); TrackSelectionDialog trackSelectionDialog = TrackSelectionDialog.createForTrackSelector( trackSelector, dismissedDialog -> {}); trackSelectionDialog.show(getSupportFragmentManager(), null); } catch (Exception e) { // 兜底捕获异常,避免极端情况崩溃 e.printStackTrace(); } } });
2. 交互优化(可选,提升用户体验)
视频加载完成前将设置按钮置为不可点击状态,避免用户误触,等ExoPlayer加载完媒体元数据后再恢复点击权限:
- 初始化/开始加载视频时禁用按钮
imgAudio.setEnabled(false); imgAudio.setAlpha(0.5f); // 置灰给用户明确的不可点击视觉提示
- 注册Player状态监听,加载完成后恢复按钮
player.addListener(new Player.Listener() { @Override public void onPlaybackStateChanged(int playbackState) { if (playbackState == Player.STATE_READY) { // 媒体元数据加载完成,恢复按钮点击权限 imgAudio.setEnabled(true); imgAudio.setAlpha(1.0f); } } });
3. 原XML布局说明
你提供的XML布局无逻辑问题,无需修改:
<ImageView android:id="@+id/img_audio" app:srcCompat="@drawable/ic_settings_white" android:layout_width="35dp" android:layout_height="35dp" android:padding="5dp"/>
问题排查参考截图

内容的提问来源于stack exchange,提问作者Sojol Rana
相关产品推荐
相关产品推荐

