如何获得具有 Uri 的文件的 mime 类型?
Posted
技术标签:
【中文标题】如何获得具有 Uri 的文件的 mime 类型?【英文标题】:How I can get the mime type of a file having its Uri? 【发布时间】:2012-09-10 12:44:08 【问题描述】:我有一个通过图库和相机获得的 Uris 列表。这些 Uris 是这样的:content://media/external/images/media/94
。我怎样才能得到它的 mime 类型?
【问题讨论】:
【参考方案1】:你可以试试
ContentResolver cR = context.getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getExtensionFromMimeType(cR.getType(uri));
编辑:
mime.getExtensionFromMimeType(cR.getType(uri))
返回 -> "jpeg"
cR.getType(uri);
返回“image/jpeg”,即预期值。
【讨论】:
mime.getExtensionFromMimeType(cR.getType(uri))
返回我 "jpeg"
但 cR.getType(uri)
返回 "image/jpeg"
这是预期值。
这不适用于某些设备..还有其他选择吗?
@AditiParikh This answer 为我工作...
@BraisGabin 我正在尝试读取 .csv 文件。出于某种原因,我得到cR.getType(uri)
的“text/csv”,但对于ime.getExtensionFromMimeType(cR.getType(uri));
,我得到空值。 .csv 只是不支持还是什么?
不,不支持。您可以在此source code 中查看当前支持的扩展程序列表。【参考方案2】:
此方法返回文件的扩展名(jpg、png、pdf、epub 等)。
public static String getMimeType(Context context, Uri uri)
String extension;
//Check uri format to avoid null
if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT))
//If scheme is a content
final MimeTypeMap mime = MimeTypeMap.getSingleton();
extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
else
//If scheme is a File
//This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());
return extension;
【讨论】:
它对我有用.. 我确实关注了developer.android.com/training/sharing/receive.html @Aaron 谢谢。它适用于非英文文件名。 当方法参数包含 Uri 时,你能解释一下为什么你需要 Uri.fromFile(new File(uri.getPath())) 因为我需要解析空格和特殊字符,即空格应该是 %20。在 uri 路径上使用 new File() 将自动解析这些特殊字符。如果删除此部分,此代码将对包含空格或特殊字符的文件名抛出错误【参考方案3】:对于Content
Uri
。
ContentResolver cr = context.getContentResolver();
mimeType = cr.getType(contentUri);
对于File
Uri
。
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(fileUri
.toString());
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
fileExtension.toLowerCase());
适用于两者,适用于 Content
和 File
。
public String getMimeType(Context context, Uri uri)
String mimeType = null;
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()))
ContentResolver cr = context.getContentResolver();
mimeType = cr.getType(uri);
else
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
.toString());
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
fileExtension.toLowerCase());
return mimeType;
【讨论】:
小心 MimeTypeMap.getFileExtensionFromUrl(),它似乎无法处理所有文件名。例如,在我的模拟器上,使用相机拍摄的照片在文件名中包含逗号和空格,这会导致此方法返回一个空字符串。如果方法调用失败,我建议回退到手动解析(获取最后一个 '.' 的索引并使用它来获取子字符串)【参考方案4】:而不是这个:
String type = mime.getExtensionFromMimeType(cR.getType(uri));
这样做:
String type = cR.getType(uri);
你会得到这个:image/jpeg
。
【讨论】:
仅适用于内容 uris (content://)。不适用于文件 uri (file://) 其实路径对于getType来说并不重要。这只是意图的另一端需要明确设置意图的类型的情况。路径通常不会发生这种情况。【参考方案5】:我将使用 Kotlin 扩展和返回类型 okhttp3.MediaType
复制 Bhavesh 的答案:
fun Uri.mimeType(contentResolver: ContentResolver)
: MediaType?
if (scheme.equals(ContentResolver.SCHEME_CONTENT))
// get (image/jpeg, video/mp4) from ContentResolver if uri scheme is "content://"
return contentResolver.getType(this)?.toMediaTypeOrNull()
else
// get (.jpeg, .mp4) from uri "file://example/example.mp4"
val fileExtension = MimeTypeMap.getFileExtensionFromUrl(toString())
// turn ".mp4" into "video/mp4"
return MimeTypeMap.getSingleton()
.getMimeTypeFromExtension(fileExtension.toLowerCase(Locale.US))
?.toMediaTypeOrNull()
【讨论】:
【参考方案6】:例如返回“image/jpeg”
fun Uri.getMimeType(context: Context): String?
return when (scheme)
ContentResolver.SCHEME_CONTENT -> context.contentResolver.getType(this)
ContentResolver.SCHEME_FILE -> MimeTypeMap.getSingleton().getMimeTypeFromExtension(
MimeTypeMap.getFileExtensionFromUrl(toString()).toLowerCase(Locale.US)
)
else -> null
【讨论】:
以上是关于如何获得具有 Uri 的文件的 mime 类型?的主要内容,如果未能解决你的问题,请参考以下文章
Symfony:如何在 ppt 和 pptx 上获得正确的 mime 类型
如何从具有 mime 类型 octet-stream 的没有扩展名的文件中提取文件扩展名?