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的缩略图库:
- 先修改
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);
- 在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
相关产品推荐
相关产品推荐

