URIを含むファイルのmimeタイプを取得するにはどうすればよいですか?


86

ギャラリーとカメラで取得したURIのリストがあります。これらのURIは次のようなものですcontent://media/external/images/media/94。mimeタイプを取得するにはどうすればよいですか?

回答:


181

あなたが試すことができます

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」を返します。


15
mime.getExtensionFromMimeType(cR.getType(uri))私返します"jpeg"が、cR.getType(uri)リターンを"image/jpeg"期待値です。
Brais Gabin 2012

これは一部のデバイスでは機能しません。代替手段はありますか?
Aditi Parikh 2017

2
@AditiParikhこの答えは ...私の作品
好奇心

1
@ BraisGabin.csvファイルを読み込もうとしています。何らかの理由で「text / csv」を取得しますcR.getType(uri)が、ime.getExtensionFromMimeType(cR.getType(uri));nullを取得します。.csvはサポートされていないだけですか?
Justin Liu

いいえ、サポートされていません。現在サポートされている拡張機能のリストは、このソースコードで確認できます
Brais Gabin 2017年

34

このメソッドは、ファイルの拡張子(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;
}

2
それは私のために働いています..私はdeveloper.android.com/training/sharing/receive.htmlを
amitabha2715 2016年

@アーロンありがとう。英語以外のファイル名に対して完全に機能します。
GhasemSadeghi19年

12

のために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()には注意してください。すべてのファイル名を処理できるわけではないようです。たとえば、私のエミュレーターでは、カメラで撮影した写真のファイル名にコンマとスペースが含まれているため、このメソッドは空の文字列を返します。(「」最後のインデックスを取得し、部分文字列を取るためにそれを使用する)私は、メソッドの呼び出しが失敗した場合は、手動解析に落下バックをお勧めします
lbenedetto

8

これの代わりに:

String type = mime.getExtensionFromMimeType(cR.getType(uri));

これを行う:

String type = cR.getType(uri);

そして、あなたはこれを得るでしょう:image/jpeg


13
コンテンツURI(content://)でのみ機能します。ファイル
uris

実際には、パスはgetTypeにとって重要ではありません。インテントのもう一方の端で、インテントのタイプを明示的に設定する必要があるのは単純なケースです。多くの場合、これはパスでは発生しません。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.