簡體   English   中英

Xamarin.Forms Android FileProvider:GrantWriteUriPermission並不總是有效

[英]Xamarin.Forms Android FileProvider: GrantWriteUriPermission not always working

我想在第三方應用程序中編輯來自我的Xamarin.Forms Android應用程序內部存儲的文件,例如填寫PDF文件中的表單元素或編輯.docx文件。

通過我的實現,文件在外部應用程序中正確打開,但在某些應用程序中,它以只讀方式打開。 Adobe Acrobat和Microsoft Word以只讀方式打開文件,而其他應用程序(如Google Docs)則可以將文件寫回文件。 (我使用的是帶有效Office365訂閱的Microsoft Word)。

我在AndroidManifest.xml中的FileProvider:

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

filepaths.xml:

<paths>
        <files-path name="files" path="."/>
</paths>

通過Xamarin.Forms DependencyService我正在啟動一個Activity並傳​​遞內容uri來啟動外部應用程序:

public void OpenFile(string fileName)
{
    string auth = "xamarintestapp.xamarintestapp.fileprovider";
    string mimeType = Android.Webkit.MimeTypeMap.Singleton.GetMimeTypeFromExtension(Android.Webkit.MimeTypeMap.GetFileExtensionFromUrl(fileName.ToLower()));
    if (mimeType == null)
        mimeType = "*/*";

    var file = new Java.IO.File(Path.Combine(Forms.Context.FilesDir.Path, fileName));
    Android.Net.Uri uri = FileProvider.GetUriForFile(Forms.Context, auth, file);

    Intent intent = new Intent(Intent.ActionView);
    intent.SetDataAndType(uri, mimeType);
    intent.AddFlags(ActivityFlags.GrantReadUriPermission | ActivityFlags.GrantWriteUriPermission);
    intent.AddFlags(ActivityFlags.NewTask | ActivityFlags.NoHistory);

    // Trying to allow writing to the external app ...
    var resInfoList = Forms.Context.PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
    foreach (var resolveInfo in resInfoList)
    {
        var packageName = resolveInfo.ActivityInfo.PackageName;
        Forms.Context.GrantUriPermission(packageName, uri, ActivityFlags.GrantWriteUriPermission | ActivityFlags.GrantPrefixUriPermission | ActivityFlags.GrantReadUriPermission);
    }

    Forms.Context.StartActivity(intent);
}

我做錯了什么或者這根本不可能?

經過進一步調查后,我可以確認這似乎是接收我意圖的應用程序的問題(例如Microsoft Word)。

當我開始編輯EDIT而不是VIEW意圖時

Intent intent = new Intent(Intent.ActionEdit);

該文件在某些​​應用程序(xodo pdf,google docs)中以寫入權限打開,但在其他應用程序(Adobe PDF Reader,Microsoft Word)中只讀,因此我假設這些應用程序未實現正確接收編輯意圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM