2016-11-07 4 views
0

파일 제공자를 사용하여 PDF 파일을 표시하려고합니다. 그러나 PDF 판독기를 열면 파일 내용이 포함되지 않습니다. 파일은 파일 폴더 내의 응용 프로그램 내부 저장소에 저장됩니다.FileProvider Xamarin에 파일이 표시되지 않습니다.

매니페스트 :

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.mycom.myapp.fileprovider" android:exported="false" android:grantUriPermissions="true"> 
     <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> 
    </provider> 

다 (file_paths) :

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <files-path name="export" /> 
</paths> 

pdfViewRenderer.cs :

string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
var path = Path.Combine(libraryPath, fileName); 


string application = "application/pdf"; 
Java.IO.File javaFile = new Java.IO.File(fileName);//externalPath 


Android.Net.Uri androidURI = FileProvider.GetUriForFile(Forms.Context.ApplicationContext, "com.mycom.myapp.fileprovider", javaFile); 


Intent intent = new Intent(Intent.ActionView); 
intent.SetDataAndType(androidURI, Filetype); 
intent.AddFlags(ActivityFlags.GrantReadUriPermission); 
intent.SetFlags(ActivityFlags.NoHistory); 
intent.SetFlags(ActivityFlags.ClearWhenTaskReset); 


Forms.Context.StartActivity(Intent.CreateChooser(intent, "Open PDF")); 

답변

0

당신이 응용 프로그램의 .apk 내에서하지 직접 액세스 파일을 수 있으며,`. apk '는 자신을 파일 시스템.

당신은 당신의 응용 프로그램 캐시 디렉토리에 AndroidAsset를 복사 할 수 있습니다 다음에 FileProvider 권한을 부여 파일 기반 외부 응용 프로그램이 앱의 샌드 박스 내에서 해당 파일에 액세스 할 수 할 수 Uri을.

provider를 추가하여 AndroidManifestapplication 요소 :

<provider 
android:name="android.support.v4.content.FileProvider" 
android:authorities="com.sushihangover.artificialgravitycalc" 
android:exported="false" 
android:grantUriPermissions="true"> 
<meta-data 
    android:name="android.support.FILE_PROVIDER_PATHS" 
    android:resource="@xml/cache_path" /> 

그런 다음 파일 이름과 일치하는 XML 파일을 추가하면 부여되는 경로가 포함 된 Resources/xml에 공급자의 android:resource: 액세스 :

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <cache-path name="appcache" path="." /> 
</paths> 

참고 : Resources 폴더에 xml 디렉토리를 추가해야 할 수도 있습니다. 기본적으로 기본 Xamarin.Android 프로젝트 템플릿을 통해 추가되지 않습니다.

당신의 .pdfAssets 디렉토리에 추가하고이 AndroidAsset 빌드 형식으로 플래그되어 있는지 확인합니다 (그리고 그것은, 소문자 xml 이름을 지정해야합니다) :

이제

enter image description here

당신은 Asset에 있음을 복사 할 수 있습니다 앱의 캐시 디렉토리에 FileProvider- 기반 Uri을 생성하고 읽기 권한을 부여한 다음 열어 봅니다. 이 경우 당신이이 application/pdf 마임 타입 처리하는 발행 적어도 하나의 설치된 응용 프로그램이 필요 : 이것은, 그러나 결과가 생산하는 .TMP를 좋아 보인다

var pdfAssetName = "PlayScriptLanguageSpecification.pdf"; 
var savePath = Path.GetTempFileName(); 
using (var assetStream = Application.Context.Assets.Open(pdfAssetName)) 
using (var fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write)) 
{ 
    byte[] buffer = new byte[1024]; 
    int readCount = 0; 
    do 
    { 
     readCount = assetStream.Read(buffer, 0, buffer.Length); 
     fileStream.Write(buffer, 0, readCount); 
    } while (readCount > 0); 
} 
var targetIntent = new Intent(Intent.ActionView); 
var file = new Java.IO.File(savePath); 
var uri = FileProvider.GetUriForFile(this, PackageName, file); 
targetIntent.SetDataAndType(uri, "application/pdf"); 
targetIntent.SetFlags(ActivityFlags.NoHistory); 
targetIntent.SetFlags(ActivityFlags.GrantReadUriPermission); 
Intent intent = Intent.CreateChooser(targetIntent, "Open File"); 
StartActivity(intent); 
+0

을하는 PDF 뷰어 내에서이 열려? – Simon

+0

@Simon 필자가 사용한 모든 PDF 뷰어에서 잘 작동하지만'GetTempPath'를 사용하여 원하는 파일 이름을 추가 할 수 있습니다 .. i.e.'var savePath = Path.Combine (Path.GetTempPath(), pdfAssetName); ' – SushiHangover

+0

나는 그저 어제와 함께 일했다 ... 그리고 당신의 해결책은 여전히 ​​나에게 똑같은 문제를 주었다. 더 살펴보면 사용 권한 문제가 있음을 발견했습니다. 수신 응용 프로그램에서 사용 권한 거부가 발생했습니다. URI 권한 부여를 통해이 문제가 해결되었으며 원래 코드를 사용할 수 있습니다. 작동하는 경우 내부 저장소를 사용하는 것이 잘못 되었습니까? – Simon