2014-10-23 2 views
2

Android 휴대 전화의 외부 저장소 (이 경우 에뮬레이션 됨)에 파일이 있습니다. 경로를 알고 있거나 File 객체를 나타내는 객체가있는 경우 Intent을 사용하여 적절한 앱에서 어떻게 열 수 있습니까?외부 저장소의 파일을 ACTION_VIEW 할 수 없습니다.

내가 시도하는 첫번째 일은이었다

startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromFile(file))); 

나는 그것을 테스트 및 응용 프로그램의 다른 부분에 이동하기 때문에이, 한 지점에서 일하고 확신합니다. 이제는 항상 ActivityNotFoundException을 던졌습니다. file.exists()true을 반환하고 파일이 올바르다는 것을 알고 있기 때문에 파일이 확실히 존재하지만 열 필요가있는 응용 프로그램이 없습니다.

이 방법으로 열 수있는 유일한 파일 유형은 내 장치에 유일한 PDF 판독기가 아니며 기본값으로 설정되지 않은 경우에도 Adobe Reader가 선택된 .pdf입니다. 나는 Adobe Reader가 온라인에있는 pdf 파일을 열도록 제안했다는 것을 알아 챘다. (크롬을 가지고 pdf를 다운로드하는 대안으로 보인다.) 즉, 위치가 원격으로 간주되기 때문에 Adobe Reader 만 Intent과 일치하는 것으로 나타났습니다 (크롬 및 기타 파일 다운로드 앱이 대안으로 표시되지 않았기 때문에 온라인이 아니지만).

는 또한 명시 적으로 MIME 타입을 명시 시도했다 :

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(file), "application/msword"); 
startActivity(intent); 

이 오른쪽 애플 리케이션에 일치하는 Intent됩니다, 그러나 그들은 모두 실제로 파일을 열 수 없습니다. 나는이 두가지를 MIME 타입을위한 하드 코딩 된 문자열로 테스트했고 MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)을 사용하여 파일 확장자를 전달했다. 다양한 파일 유형의 경우 올바른 앱이 제안되었지만 모두 파일을 열지 못했습니다.

편집 :

MIME 유형이 명시 적으로 일을했을 설정,하지만 난 아마 대답에 설명해야한다 아주 바보 같은 실수를했다.

내가 열려고 시도한 파일은 DownloadManager의 도움으로 내 앱에서 다운로드 한 인터넷에서 가져온 파일입니다. 다운로드가 완료되면 알림을 표시하는 기능을 사용합니다. 이러한 알림 중 하나를 클릭하면 파일이 완벽하게 열립니다. DownloadManager 완료 알림을 클릭했지만 운이 없었을 때 Intent의 소스 코드를 찾았습니다.

또한 ES 파일 탐색기와 같은 응용 프로그램은 내 파일을 다운로드 할 위치로 이동하여 문제없이 열 수 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

단순히 외부 저장소에있는 파일을 ACTION_VIEW 할 수 없습니까? 내 응용 프로그램은 또한 일시적으로 내부 저장 장치에 파일을 다운로드, 이들은 여전히 ​​같은 문제없이 열 수 있습니다 :

//This works for files on internal storage: 
Uri uri = FileProvider.getUriForFile(context, AUTHORITY, file); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
startActivity(intent); 

그리고 과거에서 작업으로, 이클립스를 업데이트 할 수는 SDK 도구 플러그인 및 안드로이드 SDK 자체가 원래 솔루션의 작동을 중단 시켰습니까?

+1

"VIEW"문자열에 logcat 필터링을 실행하고 내가 언급 한 작동중인 응용 프로그램 중 일부를 사용할 때 의도에 따라 해고되는 것을 확인하십시오. 그런 다음 당신의 시도와 비교하십시오. –

+0

@ChrisStratton 매우 도움이되는 의견에 감사드립니다. LogCat의 Intents를 비교하고 실수를 발견 했으므로이 질문을 편집/답변했습니다. – Matt

답변

3

은 내가 setDataAndType 시도했을 때, 게으름에서 나는 남은해야합니다

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

그냥하기 위해 또 다른 라인을 추가 :이 동일하다고 가정 ...

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file)); 
intent.setType(theMimeType); 

을 로 :

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(file), theMimeType); 
그때 내가 실제로 사용하지 않은 것을 잊어 버린해야한다

y는 setDataAndType을 시도하고 계속이 질문을 씁니다. setType을 자체적으로 사용하여 Uri을 제거한 것처럼 보였습니다. 생성자에 인수로 전달했습니다. LogCat을 사용하여 기록 된 인 텐트의 세부 정보를 보려면 유추 할 MIME 유형을 남겨두면 형식이 없음을 알았습니다. Uri을 이미 설정 한 후 Uri이 지정되지 않았고 setDataAndType을 사용하면 두 가지 모두를 의미합니다. 지정되어있어 Intent이 제대로 작동합니다.

그래서 내가 잘못하고있는 것은 setDataAndType 대신에 유형과 데이터를 따로 설정하는 것이 었습니다.

관련 문제