Uri가있는 파일의 MIME 유형을 어떻게 얻을 수 있습니까?


85

갤러리와 카메라로 얻은 Uris 목록이 있습니다. 이러한 Uris는 다음과 같습니다 content://media/external/images/media/94.. MIME 유형을 어떻게 얻을 수 있습니까?

답변:


175

당신은 시도 할 수 있습니다

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-10-12

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

@Aaron 감사합니다. 영어가 아닌 파일 이름에 대해 완벽하게 작동합니다.
Ghasem Sadeghi

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 : //)에서만 작동합니다. 파일
URI

실제로 경로는 getType에 대해 중요하지 않습니다. 인 텐트의 다른 쪽 끝이 인 텐트의 유형을 명시 적으로 설정해야하는 경우입니다. 종종 이것은 경로에 대해 발생하지 않습니다.
Tatarize
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.