2017-04-04 7 views
0

나는 여기에서 나를 이끌었던 다른 이슈로 시작 했으므로 처음부터 시작했다. 나는 사용자가 그들의 고객을 위해 따옴표를 만들 수있는 앱을 가지고있다. 응용 프로그램은 견적에 대한 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); 

답변

1

: 그때 놓치고 그이 고정 수있는 방법이 있다면 나는 fileProvider 잊을 수 // 모든 내가 찾을 때까지 작동하는 것 같았다 : // 내용에 google pdf 뷰어 앱에 대해 알아보십시오.

제로 장치에서 작동해야합니다. 아마 어도비는 이런 식으로 깨진 입력을 고치려고합니다.

String url = "file:///storage/emulated/0/MyApp/customerFolder/quote.pdf"; 
File mFile = new File(url); 

file:///storage/emulated/0/MyApp/customerFolder/quote.pdf은 파일 시스템 경로가 아닙니다. 그것은 URL입니다. 실험을 위해 /storage/emulated/0/MyApp/customerFolder/quote.pdf을 사용하십시오. 그리고 결국에는 경로를 하드 코딩하지 마십시오.

<external-path name="myApp" path="MyApp/" /> 요소는 특정 파일 시스템 경로를 포함합니다.

+0

나는 실제 경로가 무엇인지 알 수 있도록 url을 썼다. 정상적으로'Environment.getExternalStorageDirectory()'를 사용했다. 그러나'file : //'을 제거하고 단지'/ storage/emulated/... '를 사용하면 좀 더 가까이에있는 것 같아요. 그 URL은'content : //com.com.MyApp.provider/myApp/ customerFolder/quote.pdf' 파일을 열지 만 pdf 뷰어 중 아무 것도 파일을 열지 못하고 "no File Received"또는 열린 파일을 열 수 없습니다. – JStephen

+0

파일이 있으며 external_files 경로를 사용하면 다른 URL이 생성되지만 동일한 결과가 나타납니다. 나는 이것이 전에 일어났던 것과 유사하다고 느낀다. PDF 애플 리케이션은 적어도 날 오류를주고 있지만 어도비는 전혀 작동하지 않습니다. – JStephen

+0

@JStephen : 이상합니다. 보통, 당신이'FLAG_GRANT_READ_URI_PERMISSION'을 놓쳤다면 그 행동을 기대 하겠지만, 당신은 그것을 가지고 있습니다. [저의 샘플 앱] (https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider/V4FileProvider)이 제대로 작동하지만 불완전하게 작성된 클라이언트 응용 프로그램과의 'FileProvider' 호환성을 개선하는 데 도움이되는 수정 사항을 통합합니다. . – CommonsWare

0

알아서 끝내기. CommonsWare의 샘플 응용 프로그램을 기반으로 내부 저장소에 파일을 복사하고 해당 내부 저장소 URL을 사용하여 작동 시키지만 동일한 파일의 외부 저장소 URL을 사용하면 작동하지 않습니다. 그 결과로 this answer here이 나왔습니다. setType()setData()으로 설정된 데이터를 지우는 것으로 보입니다. 내부 URL을 사용하는 경우 그러나, 그런 경우가 아니었지만, 어쨌든 그것을 시도,이

Intent intent = new Intent(android.content.Intent.ACTION_VIEW); 
intent.setDataAndType(pdfURI,"application/pdf"); 

Intent intent = new Intent(android.content.Intent.ACTION_VIEW); 
intent.setData(pdfURI); 
intent.setType("application/pdf"); 

을 변경 갑자기 그것은뿐만 아니라 외부 URL로했다. 처음에는 제대로 했었지만 두 가지 방법으로 나누었습니다. 그 중 하나가 잘못되면 줄 번호로 알게 될 것이라고 생각했기 때문에 제 경우에는 매우 불만스러운 불일치가있었습니다. 희망이 다른 사람 도움

내 매니페스트 같은 있었다,하지만 난 내 경로가 바로이

<paths> 
    <external-path name="external_files" /> 
</paths> 

에 파일을 감소시켰다.