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

如何从存储视频路径生成缩略图并显示在ImageView中?

从视频路径获取缩略图Bitmap的方案

当然有合适的方法!Android 提供了现成的工具类来帮你从视频路径生成缩略图 Bitmap,下面给你两种实用的方案,结合你的场景来用:

方案一:使用 MediaMetadataRetriever(推荐,兼容性好)

这个类可以轻松提取视频的帧作为缩略图,支持大多数视频格式,而且API 10+就可用,是目前最稳妥的选择。

代码示例:

public Bitmap getVideoThumbnail(String videoPath) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    Bitmap thumbnail = null;
    try {
        retriever.setDataSource(videoPath);
        // 获取视频第一帧作为缩略图,也可以指定时间戳获取特定帧
        thumbnail = retriever.getFrameAtTime();
    } catch (IllegalArgumentException e) {
        // 处理路径无效、视频损坏等异常
        e.printStackTrace();
    } finally {
        try {
            retriever.release();
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }
    return thumbnail;
}

使用说明:

  • 如果想获取指定时间点的帧,可以用 getFrameAtTime(long timeUs),参数是微秒级的时间戳
  • 记得在子线程调用这个方法!生成缩略图是耗时操作,主线程调用可能导致ANR
  • 要确保已经获取了存储权限:Android 12及以下需要 READ_EXTERNAL_STORAGE,Android 13+需要 READ_MEDIA_VIDEO,别忘了动态申请权限

方案二:使用 ThumbnailUtils(旧版兼容,部分方法已弃用)

如果你的应用需要兼容API 28及以下,可以用这个类的静态方法,但注意API 29之后 createVideoThumbnail(String filePath, int kind) 已经被弃用,推荐用方案一替代。

代码示例(旧版):

@Deprecated
public Bitmap getVideoThumbnailLegacy(String videoPath) {
    // KIND_MICRO_KIND 是小尺寸缩略图,KIND_MINI_KIND 是中等尺寸,KIND_FULL_SCREEN_KIND 是全屏尺寸
    return ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MICRO_KIND);
}

显示到ImageView的步骤

拿到Bitmap后,直接在主线程设置到ImageView即可:

// 假设你已经从getAllMedia()拿到了视频路径列表
String firstVideoPath = videoPaths.get(0);
// 子线程生成缩略图
new Thread(() -> {
    Bitmap thumbnail = getVideoThumbnail(firstVideoPath);
    // 切回主线程更新UI
    runOnUiThread(() -> {
        if (thumbnail != null) {
            imageView.setImageBitmap(thumbnail);
        } else {
            // 加载失败时显示占位图
            imageView.setImageResource(R.drawable.ic_video_placeholder);
        }
    });
}).start();

额外优化建议

  • 可以用Glide、Picasso等图片加载库来简化流程,它们自带异步加载、缓存、占位图处理,比如Glide可以直接加载视频缩略图:
Glide.with(context)
     .asBitmap()
     .load(Uri.fromFile(new File(videoPath)))
     .placeholder(R.drawable.ic_video_placeholder)
     .into(imageView);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:40