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

RecyclerView中视频缩略图不显示的问题排查求助

视频缩略图无法显示的解决方案

你的问题核心在于Android 10及以上的Scoped Storage限制:直接通过MediaStore.Video.Media.DATA获取的文件路径加载缩略图会因权限问题失败,且该字段在API 29+已被标记为废弃。以下是具体修复方案:

方案1:使用MediaStore内容URI加载缩略图

修改VideoFilesAdapter中加载缩略图的代码,通过视频ID构建系统内容URI,替代直接加载File的方式:

// 替换原Glide加载代码
Uri videoUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
                    Long.parseLong(videoList.get(position).getId()));
Glide.with(context)
     .load(videoUri)
     .placeholder(R.drawable.ic_video_placeholder) // 可选:添加加载占位图
     .error(R.drawable.ic_load_error) // 可选:添加加载失败兜底图
     .into(holder.thumbnail);

方案2:直接获取系统生成的缩略图

如果需要更高效的缩略图加载,可以查询MediaStore的缩略图库:

  1. 先修改fetchMedia方法,添加缩略图路径查询:
// 在fetchMedia的cursor循环内添加
String thumbnailPath = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Thumbnails.DATA));
// 同步更新MediaFiles类,新增thumbnailPath字段及对应的构造方法、getter
MediaFiles mediaFiles = new MediaFiles(id, title, displayName, size, duration, path, dateAdded, thumbnailPath);
  1. 在Adapter中加载缩略图:
Glide.with(context)
     .load(new File(videoList.get(position).getThumbnailPath()))
     .into(holder.thumbnail);

注:部分视频可能未生成系统缩略图,需添加加载失败的兜底逻辑

额外修复:时长转换函数的逻辑错误

你的timeConversion方法计算逻辑有误,会导致时长显示异常,修复如下:

public String timeConversion(long value){
    String videoTime;
    long duration = value;

    long hours = duration / 3600000;
    long minutes = (duration % 3600000) / 60000;
    long seconds = (duration % 60000) / 1000;

    if(hours > 0){
        videoTime = String.format("%02d:%02d:%02d", hours, minutes, seconds);
    } else {
        videoTime = String.format("%02d:%02d", minutes, seconds);
    }

    return videoTime;
}

权限注意事项

确保App已申请对应权限:

  • Android 10及以下:READ_EXTERNAL_STORAGE
  • Android 11+(targetSdk>=33):READ_MEDIA_VIDEO

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:25:50