나는 여기에서 나를 이끌었던 다른 이슈로 시작 했으므로 처음부터 시작했다. 나는 사용자가 그들의 고객을 위해 따옴표를 만들 수있는 앱을 가지고있다. 응용 프로그램은 견적에 대한 pdf를 만들고 다른 응용 프로그램이 액세스 할 수 있도록 특별히 외부 저장소에 저장합니다. 최근에 내 애플 리케이션 (구글 pdf 뷰어, 구글 드라이브 뷰어는 빈 화면 adobe acrobat 동안 완벽하게 괜찮습니다) 내에서 열 때 특정 애플 리케이션에서 PDF를 볼 수 없습니다 보인다. pdf는 아무 문제없이 파일 관리자에서 볼 수 있기 때문에 괜찮습니다. 애플 리케이션에서 열 때 그냥 작동하지 않습니다.FileProvider와 관련된 문제
내가 file://...
로 제공하는 데 사용하지만, SDK (24)에 도입 노출 된 URI 예외로 실행 content://path/to/external/storage/MyApp/customerName/quote.pdf
에 URI 유사과 의도를 제공하는, 그래서 단순히 파일의 이름을 변경 : // 내용 :// 그리고 모두 내가 구글 PDF 뷰어 애플 리케이션에 대해 알기 전까지 일하는 것 같았다.
이제 필자는 분명히 사용 했어야하는 fileProvider 클래스와 관련이 있다고 가정합니다. 하지만 전혀 작동하지 않는 것 같아요. 문제에 관해 발견 된 다른 질문 중 아무 것도 작동하지 않는 것 같습니다. 그래서 지금 제가 가지고있는 것이 여기에 있습니다.
file_paths.xml (몇 가지 다른 경로를 시도했습니다. , 아무도 작동하는 것 같습니다. 또한 여러 고객 폴더를 사용자가 만든, 나는 xml 파일에서 그들을 지정할 수 없기 때문에 그들이 무엇을 지명 모르겠지만 테스트를 위해 거기에 하나 던져 그냥 던져 나는이 경우 몰라요, 거기에 라인을 교체 : 문제와 여전히 작동하지 않습니다)
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="." />
<external-path name="myApp" path="MyApp/" />
<external-path name="myAppa" path="MyApp/customerFolder/" />
<external-path name="myAppb" path="/" />
</paths>
매니페스트 파일 (나는 도구를 가지고 이유입니다 포함 중 하나에 의해 사용되는 파일 제공자가 문제를 일으키는 지 여부와 관계없이 이 나에게 다음과 같은 오류 java.lang.IllegalArgumentException: Failed to find configured root that contains /file:/storage/emulated/0/MyApp/customerFolder/quote.pdf
을 제공하고있다
String url = "file:///storage/emulated/0/MyApp/customerFolder/quote.pdf";
File mFile = new File(url);
Uri pdfURI = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", mFile);
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setData(pdfURI);
intent.setType("application/pdf");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.startActivity(intent);
:로부터 PDF 파일)
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="authorities"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
tools:replace="android:resource"/>
</provider>
그리고 PDF 파일을 볼 의도를 시작 페이지를 볼하려고 같은 디렉토리 메신저에 사진을 저장 FileProvider.getUriForFile()
방법이 포함 된 행의 필자는 경로를 확인하고는
는 또한이 그것은 Google이 아닌 PDF 뷰어 또는 구글 드라이브 뷰어 어도비 아크로벳을 위해 작동하지만, 내가 가진 데 사용되는 코드입니다, 맞습니다. 단순히 파일 이름을 변경
String url = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? "content://" : "file://") + "/storage/emulated/0/MyApp/customerFolder/quote.pdf";
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url),"application/pdf");
activity.startActivity(intent);
나는 실제 경로가 무엇인지 알 수 있도록 url을 썼다. 정상적으로'Environment.getExternalStorageDirectory()'를 사용했다. 그러나'file : //'을 제거하고 단지'/ storage/emulated/... '를 사용하면 좀 더 가까이에있는 것 같아요. 그 URL은'content : //com.com.MyApp.provider/myApp/ customerFolder/quote.pdf' 파일을 열지 만 pdf 뷰어 중 아무 것도 파일을 열지 못하고 "no File Received"또는 열린 파일을 열 수 없습니다. – JStephen
파일이 있으며 external_files 경로를 사용하면 다른 URL이 생성되지만 동일한 결과가 나타납니다. 나는 이것이 전에 일어났던 것과 유사하다고 느낀다. PDF 애플 리케이션은 적어도 날 오류를주고 있지만 어도비는 전혀 작동하지 않습니다. – JStephen
@JStephen : 이상합니다. 보통, 당신이'FLAG_GRANT_READ_URI_PERMISSION'을 놓쳤다면 그 행동을 기대 하겠지만, 당신은 그것을 가지고 있습니다. [저의 샘플 앱] (https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider/V4FileProvider)이 제대로 작동하지만 불완전하게 작성된 클라이언트 응용 프로그램과의 'FileProvider' 호환성을 개선하는 데 도움이되는 수정 사항을 통합합니다. . – CommonsWare