2017-02-15 23 views
1

私がしたい私のXamarin.Forms Androidアプリのサードパーティ製アプリケーションの内部ストレージからファイルを編集します。たとえば、PDFファイルのフォーム要素を記入するか、 docxファイル。Xamarin.Forms Android FileProvider:GrantWriteUriPermissionが常に動作しない

私の実装では、ファイルは外部アプリケーションで正しく開かれますが、特定のアプリケーションでは読み取り専用が開きます。 Adob​​e AcrobatとMicrosoft Wordはファイルを読み取り専用で開きますが、Google Docsのような他のアプリケーションはファイルに書き戻すことができます。 (私は有効なOffice365サブスクリプションでMicrosoft Wordを使用しています)。

のAndroidManifest.xmlで私のFileProvider:私は活動を開始し、外部を起動するには、コンテンツのURIを渡していますXamarin.Forms DependencyService経由

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

<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アプリ:

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); 
} 

私は何か間違っているのですか?これは簡単ではありませんか?

+1

1つのアプリが期待どおりに動作していない場合、2つのアプリが非難するのはなぜですか?他の拡張機能や他のアプリを試してみてください。ファイルプロバイダなしで2つのアプリを試してみてください。 – greenapps

+0

私はFileProviderなしで両方のアプリを試しました(ファイルを外部ストレージにコピーしてそこから開く - ファイルは書き込み可能になっています)。 ContentProviderとDocumentProviderを試しましたが、同じ結果で、いくつかのアプリケーションが読み込み専用のファイルを開いているのに対して、他の人は読んでいないのですが、私は興味があります。 – stefffdev

+0

'Forms.Context.StartActivity Xamarin.Androidではなく、Xamarin.Formsソリューションを実際に開発しています。そうですか?あなたの問題は、Androidプラットフォームではなく、UWPのような他のプラットフォームへの書き込み許可についてですか? –

答えて

0

さらに調査した結果、これは自分の意図(Microsoft Wordなど)を受け取っているアプリの問題であるようです。

ファイルは、特定のアプリで書き込みアクセス(xodo PDF、Googleドキュメント)で開かれたが、読み取り専用の他のアプリにされ

Intent intent = new Intent(Intent.ActionEdit); 

のように、私が代わりにVIEWの意図のEDIT意図を開始(アドビPDFリーダー、Microsoft Word)ので、私はこれらのアプリが編集意図を正しく受け取ることを実装していないと仮定しています。

関連する問題