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)。
我的 FileProvider 在 AndroidManifest.xml:
<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 文档)中以写入权限打开,但在其他应用程序(Adobe PDF Reader、Microsoft Word)中是只读的,所以我假设这些应用程序没有正确接收编辑意图。
我想在第三方应用程序中 编辑 我的 Xamarin.Forms Android 应用程序内部存储中的文件,例如在PDF 文件或编辑 .docx 文件。
通过我的实现,文件在外部应用程序中正确打开,但在某些应用程序中它被打开 只读。 Adobe Acrobat 和 Microsoft Word 以只读方式打开文件,而 Google Docs 等其他应用程序能够写回文件。 (我正在使用具有有效 Office365 订阅的 Microsoft Word)。
我的 FileProvider 在 AndroidManifest.xml:
<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 文档)中以写入权限打开,但在其他应用程序(Adobe PDF Reader、Microsoft Word)中是只读的,所以我假设这些应用程序没有正确接收编辑意图。