You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView中播放Firebase视频黑屏问题求助

解决RecyclerView中VideoView播放Firebase视频黑屏的问题

从你的Logcat输出和代码来看,核心问题是VideoView的setVideoPath方法无法正确处理HTTPS格式的Firebase存储URL,直接抛出了FileNotFoundException。下面是一步步的针对性解决方案:

1. 替换setVideoPath为setVideoURI

setVideoPath更适配本地文件路径,对于远程HTTPS URI,直接使用setVideoURI方法更可靠,它能正确处理网络URI和Content Provider逻辑:

修改你的onBindViewHolder方法:

@Override
public void onBindViewHolder(RecyclerViewAdapter2.ViewHolder holder, int position) {
    ImageUploadInfo UploadInfo = MainImageUploadInfoList.get(position);
    holder.imageNameTextView.setText(UploadInfo.getImageName());
    Uri uri = Uri.parse(UploadInfo.getImageURL());
    Log.d("TAGGG" , ""+uri);
    // 替换setVideoPath为setVideoURI
    holder.videoView.setVideoURI(uri);
    // 视频准备完成后自动播放(可选,根据需求调整)
    holder.videoView.setOnPreparedListener(mp -> {
        mp.setLooping(true); // 可选:设置循环播放
        holder.videoView.start();
    });
}

2. 确认网络权限已添加

检查你的AndroidManifest.xml是否包含互联网权限,没有的话务必加上:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 可选:用于检测网络状态,优化播放体验 -->

3. 处理RecyclerView中VideoView的生命周期复用问题

RecyclerView的ViewHolder会被频繁复用,VideoView的Surface可能在复用过程中被销毁,导致播放异常。需要在适配器中重写以下方法管理播放状态:

@Override
public void onViewAttachedToWindow(ViewHolder holder) {
    super.onViewAttachedToWindow(holder);
    // 当ViewHolder回到窗口时,恢复播放
    if (holder.videoView != null && !holder.videoView.isPlaying()) {
        holder.videoView.start();
    }
}

@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
    super.onViewDetachedFromWindow(holder);
    // 当ViewHolder离开窗口时,暂停并释放资源
    if (holder.videoView != null) {
        holder.videoView.pause();
        holder.videoView.stopPlayback();
    }
}

同时在ViewHolder构造函数中确保正确初始化VideoView:

public ViewHolder(View itemView) {
    super(itemView);
    videoView = (VideoView) itemView.findViewById(R.id.videoView2);
    imageNameTextView = (TextView) itemView.findViewById(R.id.textView12);
}

4. 推荐用ExoPlayer替代VideoView(更稳定的方案)

如果以上方法仍未解决问题,建议使用Google官方的ExoPlayer——它对网络视频(尤其是HTTPS)的支持更完善,也更适配RecyclerView的视图复用场景。结合你代码中已有的ExoPlayer变量,修改如下:

首先在Module级build.gradle添加依赖(替换为最新版本):

implementation "com.google.android.exoplayer:exoplayer:2.19.1"

然后修改适配器核心代码:

@Override
public void onBindViewHolder(RecyclerViewAdapter2.ViewHolder holder, int position) {
    ImageUploadInfo UploadInfo = MainImageUploadInfoList.get(position);
    holder.imageNameTextView.setText(UploadInfo.getImageName());
    Uri uri = Uri.parse(UploadInfo.getImageURL());
    
    // 初始化ExoPlayer实例
    if (holder.exoPlayer == null) {
        holder.exoPlayer = new SimpleExoPlayer.Builder(context2).build();
        holder.exoPlayerView.setPlayer(holder.exoPlayer);
        holder.exoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); // 设置循环播放
    }
    
    // 加载并播放视频
    MediaItem mediaItem = MediaItem.fromUri(uri);
    holder.exoPlayer.setMediaItem(mediaItem);
    holder.exoPlayer.prepare();
    holder.exoPlayer.play();
}

// 管理ExoPlayer生命周期
@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
    super.onViewDetachedFromWindow(holder);
    if (holder.exoPlayer != null) {
        holder.exoPlayer.pause();
        holder.exoPlayer.release();
        holder.exoPlayer = null;
    }
}

@Override
public void onViewAttachedToWindow(ViewHolder holder) {
    super.onViewAttachedToWindow(holder);
    if (holder.exoPlayer != null) {
        holder.exoPlayer.play();
    }
}

// 更新ViewHolder
class ViewHolder extends RecyclerView.ViewHolder {
    public TextView imageNameTextView;
    public SimpleExoPlayerView exoPlayerView;
    public SimpleExoPlayer exoPlayer;

    public ViewHolder(View itemView) {
        super(itemView);
        exoPlayerView = (SimpleExoPlayerView) itemView.findViewById(R.id.exo_player_view);
        imageNameTextView = (TextView) itemView.findViewById(R.id.textView12);
    }
}

额外检查点

  • 确认Firebase存储的视频文件权限为公开可读,或你的App已通过Firebase身份验证获取了私有文件的访问权限;
  • 复制Firebase提供的URL到浏览器中测试,确保视频可以正常播放,排除文件损坏或URL过期问题。

内容的提问来源于stack exchange,提问作者Darryl Fernandes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:18:51