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

Android Studio中如何判断Firebase拉取的URL是图片还是视频资源

Firebase存储资源URL类型识别解决方案

方案1:上传阶段预埋类型字段(首推)

用户上传资源到Firebase Storage时,同步在关联的数据库(Firestore/实时数据库)资源记录中新增resource_type字段,取值固定为image或video。后续拉取资源时直接读取该字段判断类型即可,完全不受URL有无后缀的影响,性能开销为0。

方案2:本地后缀+网络请求联合判断(适配存量数据)

如果已有存量数据无法修改上传逻辑,可以先做本地后缀快速判断,后缀识别失败再通过低成本的HTTP HEAD请求读取响应头Content-Type字段确认类型,代码实现如下:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ResourceTypeUtil {
    // 注意:该方法包含网络请求,请勿在主线程直接调用,需放入异步任务/协程中执行
    public static boolean isVideo(String url) {
        // 第一步:本地后缀快速判断
        String lowerCaseUrl = url.toLowerCase();
        // 匹配常见视频后缀
        if (lowerCaseUrl.contains(".mp4") || lowerCaseUrl.contains(".mov") 
            || lowerCaseUrl.contains(".avi") || lowerCaseUrl.contains(".flv")
            || lowerCaseUrl.contains(".wmv") || lowerCaseUrl.contains(".mkv")) {
            return true;
        }
        // 匹配常见图片后缀
        if (lowerCaseUrl.contains(".png") || lowerCaseUrl.contains(".jpg") 
            || lowerCaseUrl.contains(".jpeg") || lowerCaseUrl.contains(".webp")
            || lowerCaseUrl.contains(".gif") || lowerCaseUrl.contains(".bmp")) {
            return false;
        }
        // 第二步:后缀识别失败,发起HEAD请求仅拉取响应头判断Content-Type
        OkHttpClient httpClient = new OkHttpClient();
        Request headRequest = new Request.Builder()
                .url(url)
                .head()
                .build();
        try (Response response = httpClient.newCall(headRequest).execute()) {
            String contentType = response.header("Content-Type");
            // 所有视频类型的Content-Type均以video/开头,比如video/mp4、video/mpeg等
            return contentType != null && contentType.startsWith("video/");
        } catch (IOException e) {
            e.printStackTrace();
            // 请求异常时可根据业务需求默认返回false,或做降级处理
            return false;
        }
    }
}

使用时直接调用工具类方法即可匹配你给出的业务逻辑:

MyUserModel model;
String url = model.getUrl();

new Thread(() -> {
    boolean isVideoResource = ResourceTypeUtil.isVideo(url);
    runOnUiThread(() -> {
        if (isVideoResource) {
            videoView.setVideoPath(url);
            // 视频播放相关逻辑
        } else {
            Glide.with(context).load(url).into(imageView);
            // 图片加载相关逻辑
        }
    });
}).start();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:18:03