2012-06-17 4 views
20

나는이 모든 비슷한 질문을 여기에서 검토했지만, 나 자신의 삶이 내가 잘못하고있는 것을 알아낼 수는 없다.파일 및 MIME 유형에 대한 인 텐트를 시작 하시겠습니까?

필자는 일종의 파일 브라우저 인 다양한 파일을 실행하려고하는 응용 프로그램을 작성했습니다. 파일을 클릭하면 관련 MIME 형식을 기반으로 프로그램을 시작하려고 시도하거나 "시작할 응용 프로그램 선택"대화 상자를 표시합니다. 여기

내가 시작 사용하고 코드입니다 :

File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position)); 

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); 

    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); 
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    myIntent.setDataAndType(Uri.fromFile(file),mimetype); 
    startActivity(myIntent); 

이 실패하고 오류 발생 : 내가 예를 들어 OI 파일 관리자를 설치하면 이제

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes } 

를,이 대신 열립니다 오류가 발생하고 내에서 동일한 파일을 클릭하면 적절한 대화 상자가 시작됩니다.

특정 파일의 MIME 유형이 실패했지만 .zip과 같은 다른 MIME 유형이 값을 반환한다는 것을 알아 챘습니다.

MIME 형식이 null 인 경우 사용자가 선택할 수있는 대화 상자를 호출 할 때 그 내용이 누락 되었습니까?

MIME 형식을 설정하지 않고 .setData 만 사용하여 앱을 시작한 다른 변형을 시도했습니다.

내가 원하는 동작은 사용자가 파일을 클릭하면 응용 프로그램이 실행되는 응용 프로그램과 연결될 경우 파일을 클릭하고 그렇지 않으면 사용자가 응용 프로그램 목록과 함께 "사용 완료 동작"대화 상자를 가져옵니다.

어떤 조언을 주셔서 감사합니다.

+0

mimetype 문자열은 무엇입니까? 여기에 붙여 넣으십시오. –

+0

관련 파일이있는 것처럼 보이지만 올바른 MIME 유형입니다.하지만 앱에 연결되어 있지 않은 경우 null을 통해 나타납니다. – stonedonkey

답변

44

음 덕분에, 내가 대답을 자신의 파일 관리자에서 자신의 코드를 통해 처음으로 놓친, 여기에 내가 함께 결국 무엇을 :

File file = new File(filePath); 
    MimeTypeMap map = MimeTypeMap.getSingleton(); 
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); 
    String type = map.getMimeTypeFromExtension(ext); 

    if (type == null) 
     type = "*/*"; 

    Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri data = Uri.fromFile(file); 

    intent.setDataAndType(data, type); 

    startActivity(intent); 

당신은 "*/*" 때의 MIME 형식을 사용하는 경우 (null) 시스템에서 확인할 수 없으므로 적절한 선택 응용 프로그램 대화 상자가 실행됩니다.

+7

경고! - jpg의 경우 mime 형식은 jpeg이며 NOT jpg입니다. 코드를 사용하여 jpg 확장자를 추출하면 MIME 유형이 올바르게 설정되지 않으므로 이미지를 볼 수 없습니다. jpg 이미지의 MIME 유형을 설정할 때 jpg를 jpeg로 교체해야합니다. – AndroidDev

+0

덕분에 도와 주지만 실제로 파일을 선택하지 intent.setDataAndType (데이터, 유형); 파일을 업로드하지 못했습니다. –

+1

또한 MimeTypeMap.getFileExtensionFromUrl은 아포스트로피를 제대로 처리 할 수 ​​없습니다. "World'sHello.docx"에 대해 빈 문자열을 반환하지만 "WorldzHello.docx"에 대해서는 docx를 반환합니다. 여기 Regex를보십시오 : https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

당신은 here를 제안이 코드 조각처럼 파일을 열 일반적인 의도를 사용할 수 있습니다

private void openFile(File aFile){ 
    try { 
     Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION, 
     new ContentURI("file://" + aFile.getAbsolutePath())); 
     startActivity(myIntent); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
}  

하지만 일반적으로 응용 프로그램 "에 파일을 열려고 중첩 된 마지막 경우의 파일의 확장자를 확인 볼 텍스트/일반 "유형 :

Intent generic = new Intent(); 
generic.setAction(android.content.Intent.ACTION_VIEW); 
generic.setDataAndType(Uri.fromFile(file), "text/plain");  
try { 
    startActivity(generic); 
    } catch(ActivityNotFoundException e) { 
    ... 
}  

당신은 this question 또는이 open source project에 전체 코드를 볼 수 있습니다. 나는 이것이 당신을 도왔기를 바랍니다. 열기 의도들에

+0

나는이 두 가지를 시도해 본 결과가 없습니다. 내가 찾는 결과. 첫 번째 예제는 동일한 예외를 생성합니다. 두 번째는 text/plain을 MIME 형식으로 이해하는 앱만 실행하려고하므로 mime 유형으로도 작동하지 않습니다. 감사합니다. – stonedonkey