2

私のアプリにFileProviderがありますが、それは動作しているように見せかけますが、開いているファイルは空白です。私は、ファイルが指定されたディレクトリのデバイス上に既に存在し、空ではないことを確認しましたが、私のアプリの中からファイルを開くときに失敗します。クラッシュはなく、エラーメッセージもありません。誰もこれを見たことがありますか?FileProviderがPDFを開いていますが、空白です。どうして?

FileProvider:

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

provider_paths.xml

<?xml version="1.0" encoding="utf-8" ?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="external_storage" path="." /> 
</paths> 

コード:

var path = "/storage/emulated/0/MyApp/User/attachments/folder/attachment.pdf" 
    var file = new Java.IO.File(path); 
    var mime = MimeTypeMap.Singleton; 
    var ext = MimeTypeMap.GetFileExtensionFromUrl(path).ToLower(); 
    var type = mime.GetMimeTypeFromExtension(ext); 

    var intent = new Intent(); 
    intent.SetAction(Intent.ActionView); 
    var name = activity.PackageName + ".provider"; 
    var uri = FileProvider.GetUriForFile(activity.ApplicationContext, name, file); 
    intent.SetDataAndType(uri, type); 
    intent.SetFlags(ActivityFlags.GrantReadUriPermission); 
    intent.SetFlags(ActivityFlags.GrantWriteUriPermission); 

    var packageManager = activity.PackageManager; 
    if (intent.ResolveActivity(packageManager) != null) 
     activity.RunOnUiThread(() => activity.StartActivity(intent)); 
    else 
    { 
     var message = "No viewer for attachments: " + type; 
     activity.RunOnUiThread(() => 
      Snackbar.Make(view, message, Snackbar.LengthLong).Show() 
     ); 
    } 

私は、URIがされて終わるか見てデバッグしている、それは右になります。

u ri.Path:

"/external_storage/MyApp/User/attachments/folder/attachment.pdf" 

uri.ToString():

"content://com.my.redacted.provider/external_storage/MyApp/User/attachments/folder/attachment.pdf" 

は、だから私は本当に何が起こっているかわかりません。

注:私は/ storage/emulated/0/MY_STUFFに自分のドキュメントを持っていますが、これが<external-path>が返ってきたものであることを確認しました。

+0

'新しいjava.io.Fileに(パス);'。パスの値を表示してください。 – greenapps

+0

私はその時点でパスが私の質問に追加されました。パスには、その外部ディレクトリが含まれています。 –

+0

uri.getPath()とuri.toString()の値も教えてください。 – greenapps

答えて

0

ファイルエクスプローラはファイルシステムパスを提供します。しかし今、あなたはそれにコンテンツスキームのパスを提供します。あなたは視聴者がコンテンツ計画を扱うことができるかどうか分かりますか?他のアプリをお試しください。

2

私は同じ問題がありました。 pdfリーダーがFileProviderから提供されたファイルを開くことができませんでした。

私のソリューションは、フラグGRANT_READ_URI_PERMISSIONを追加しました:

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

はたぶん、あなたのせいではあなたのコード内でFLAG_GRANT_READ_URI_PERMISSIONをオーバーライドした

intent.setFlags(ActivityFlags.GrantReadUriPermission); 
intent.setFlags(ActivityFlags.GrantWriteUriPermission); <- overrides the 1st flag 
関連する問題