我的应用程序正在创建PDF并将其传递给其他应用程序,以便在其他地方显示。我在内部存储中创建文件,以便要求用户减少权限。
我创建了我的意图:
Intent viewIntent = new Intent(Intent.ActionView);
Java.IO.File document = new Java.IO.File(filePath);
Android.Net.Uri contentUri = FileProvider.GetUriForFile(
_context,
_context.PackageName + ".provider",
document);
viewIntent.SetDataAndType(contentUri, GetMimeType(document));
viewIntent.SetFlags(ActivityFlags.NewTask);
viewIntent.AddFlags(ActivityFlags.GrantReadUriPermission);
viewIntent.AddFlags(ActivityFlags.ClearTask);
viewIntent.AddFlags(ActivityFlags.GrantPersistableUriPermission);
viewIntent.AddFlags(ActivityFlags.GrantPrefixUriPermission);
viewIntent.AddFlags(ActivityFlags.GrantWriteUriPermission);
Intent chooser = Intent.CreateChooser(viewIntent, "");
chooser.SetFlags(ActivityFlags.NewTask);
chooser.AddFlags(ActivityFlags.GrantReadUriPermission);
chooser.AddFlags(ActivityFlags.ClearTask);
chooser.AddFlags(ActivityFlags.GrantPersistableUriPermission);
chooser.AddFlags(ActivityFlags.GrantPrefixUriPermission);
chooser.AddFlags(ActivityFlags.GrantWriteUriPermission);
_context.StartActivity(viewIntent);
在我测试的Google Pixel 3 XL上,我可以打开PDF而不会出现任何问题。
当我在具有API级别24的华为平板电脑上执行相同操作时,有时一切正常,但在其他时候Adobe Acrobat显示错误:This file could not be accessed. Check the location or the network and try again.
这种行为不是确定性的,有时候我会得到错误,但有时候一切正常。
在Android Manifest的Application
节点中,确保已添加FileProvider定义:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.FileProvider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
</provider>
添加包含以下内容的Resources/xml/provider_paths
文件:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
如果需要,您可以稍后限制。但是,对于我的用例,我将文件放在我共享的外部存储器中。您需要根据共享的位置进行相应调整。
即如果您要从内部应用程序存储共享文件,则还需要在其中添加files-path
定义。
然后在共享文件时,您只需:
var packageName = context.ApplicationInfo.PackageName;
var fileProviderName = $"{packageName}.FileProvider";
var intent = new Intent(Intent.ActionSend);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
intent.SetType("image/*"); // change mime type if wanting to open in other app
intent.PutExtra(Intent.ExtraStream,
FileProvider.GetUriForFile(context, fileProviderName, new Java.IO.File(filePath)));
StartActivity(intent);
这应该足够了,每次我都可以将图像分享给另一个应用程序。我认为你不需要你的选择器Intent
的标志,只有内部viewIntent
。如果你提供旗帜,GrantReadUriPermission
应该是唯一需要的东西。