안드로이드에서 MIME 유형의 파일을 결정하는 방법은 무엇입니까? Uri uri = Uri.fromFile(file);

(/sdcard/tlogo.png)와 같은 파일의 전체 경로가 있다고 가정하십시오. MIME 유형을 알고 싶습니다.

나는 그것을위한 함수를 만들었다

public static String getMimeType(File file, Context context)
{
    Uri uri = Uri.fromFile(file);
    ContentResolver cR = context.getContentResolver();
    MimeTypeMap mime = MimeTypeMap.getSingleton();
    String type = mime.getExtensionFromMimeType(cR.getType(uri));
    return type;
}

하지만 내가 전화하면 null을 반환합니다.

File file = new File(filePath);
String fileType=CommonFunctions.getMimeType(file, context);


답변

가장 먼저 다음과 MimeTypeMap#getMimeTypeFromExtension()같이 호출하는 것을 고려해야 합니다.

// url = file path or whatever suitable URL you want.
public static String getMimeType(String url) {
    String type = null;
    String extension = MimeTypeMap.getFileExtensionFromUrl(url);
    if (extension != null) {
        type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    }
    return type;
}

답변

모든 파일의 MIME 유형 감지

public String getMimeType(Uri uri) {
    String mimeType = null;
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        ContentResolver cr = getAppContext().getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
}

답변

위의 MimeTypeMap 솔루션이 내 사용법에서 null을 반환했습니다. 이것은 작동하며 더 쉽습니다.

Uri uri = Uri.fromFile(file);
ContentResolver cR = context.getContentResolver();
String mime = cR.getType(uri);

답변

null 안전 및 대체 유형 으로 Jens 응답 의 최적화 된 버전 .

@NonNull
static String getMimeType(@NonNull File file) {
    String type = null;
    final String url = file.toString();
    final String extension = MimeTypeMap.getFileExtensionFromUrl(url);
    if (extension != null) {
        type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase());
    }
    if (type == null) {
        type = "image/*"; // fallback type. You might set it to */*
    }
    return type;
}

중요 : getFileExtensionFromUrl ()은 소문자 에서만 작동합니다 !


업데이트 (19.03.2018)

보너스 : 덜 장황한 Kotlin 확장 기능 으로 위의 방법 :

fun File.getMimeType(fallback: String = "image/*"): String {
    return MimeTypeMap.getFileExtensionFromUrl(toString())
            ?.run { MimeTypeMap.getSingleton().getMimeTypeFromExtension(toLowerCase()) }
            ?: fallback // You might set it to */*
}

답변

File file = new File(path, name);

    MimeTypeMap mime = MimeTypeMap.getSingleton();
    int index = file.getName().lastIndexOf('.')+1;
    String ext = file.getName().substring(index).toLowerCase();
    String type = mime.getMimeTypeFromExtension(ext);

    intent.setDataAndType(Uri.fromFile(file), type);
    try
    {
      context.startActivity(intent);
    }
    catch(ActivityNotFoundException ex)
    {
        ex.printStackTrace();

    }

답변

위 의 umerk44 솔루션에 세심한주의를 기울이 십시오 . CASE SENSITIVE를 getMimeTypeFromExtension호출합니다 guessMimeTypeTypeFromExtension. 나는이 다음 면밀한 관찰을했다에 오후를 보냈다 – getMimeTypeFromExtension반환 NULL당신이 “JPG”당신이 “JPG”를 전달할 경우는 “이미지 / JPEG”를 반환하는 반면 그것을 전달하는 경우.


답변

내 안드로이드 앱에서 사용한 솔루션은 다음과 같습니다.

public static String getMimeType(String url)
    {
        String extension = url.substring(url.lastIndexOf("."));
        String mimeTypeMap = MimeTypeMap.getFileExtensionFromUrl(extension);
        String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(mimeTypeMap);
        return mimeType;
    }