【问题标题】:How I can get the mime type of a file having its Uri?如何获得具有 Uri 的文件的 mime 类型?
【发布时间】:2012-09-10 12:44:08
【问题描述】:

我有一个通过图库和相机获得的 Uris 列表。这些 Uris 是这样的:content://media/external/images/media/94。我怎样才能得到它的 mime 类型?

【问题讨论】:

    标签: android uri mime-types


    【解决方案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】:

    对于ContentUri

    ContentResolver cr = context.getContentResolver();
    mimeType = cr.getType(contentUri);
    

    对于FileUri

    String fileExtension = MimeTypeMap.getFileExtensionFromUrl(fileUri
                .toString());
    mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    

    适用于两者,适用于 ContentFile

    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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-30
        • 2015-09-13
        • 2018-12-01
        • 2014-09-28
        • 2021-10-05
        • 2017-08-23
        • 2011-04-20
        • 2015-12-16
        • 1970-01-01
        相关资源
        最近更新 更多