有没有办法检查我作为URI加载的文件是android中的图像还是视频?我正在尝试动态地将图像和视频加载到片段中以获得列表/详细信息视图,并且需要区分它们。
答案 0 :(得分:45)
我会检查mimeType,然后检查它是否与图像或视频相对应。
用于检查文件路径是否为图像的完整示例为:
public static boolean isImageFile(String path) {
String mimeType = URLConnection.guessContentTypeFromName(path);
return mimeType != null && mimeType.startsWith("image");
}
视频:
public static boolean isVideoFile(String path) {
String mimeType = URLConnection.guessContentTypeFromName(path);
return mimeType != null && mimeType.startsWith("video");
}
答案 1 :(得分:10)
如果您从内容解析器获取Uri,则可以使用getType(Uri)获取mime类型;
ContentResolver cR = context.getContentResolver();
String type = cR.getType(uri);
应该返回类似于“image / jpeg”的东西,你可以检查它的显示逻辑。
答案 2 :(得分:0)
通过ContentResolver
检查类型似乎最合适(如jsrssoftware answer中所示)。虽然,在某些情况下,这可能会返回null
。
在这种情况下,我最终尝试将流解码为Bitmap以确认它在图像中(但只解码边界,因此它非常快且消耗的内存不多)。
我的图像测试器助手功能如下所示:
public static boolean checkIsImage(Context context, Uri uri) {
ContentResolver contentResolver = context.getContentResolver();
String type = contentResolver.getType(uri);
if (type != null) {
return type.startsWith("image/");
} else {
// try to decode as image (bounds only)
InputStream inputStream = null;
try {
inputStream = contentResolver.openInputStream(uri);
if (inputStream != null) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, options);
return options.outWidth > 0 && options.outHeight > 0;
}
} catch (IOException e) {
// ignore
} finally {
FileUtils.closeQuietly(inputStream);
}
}
// default outcome if image not confirmed
return false;
}
对于视频,可以采用类似的方法。我不需要它,但我相信MediaMetadataRetriever
可用于验证流是否包含有效视频type
检查失败。
答案 3 :(得分:-16)
最简单的方法是检查我猜的扩展名
if ( file.toString().endsWith(".jpg") {
//photo
} else if (file.toString().endsWith(".3gp")) {
//video
}