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
相关产品推荐
相关产品推荐

