c# - Xamarin FileProvider 无法在 Android 中打开文件
问题描述
在我的 Xamarin Forms 应用程序中,我创建了可以使用 Android 应用程序打开的 pdf。
使用 Android 7 的设备一切正常,现在我已经使用 Android 8 对其进行了测试,但文件无法打开。
我已安装 Xam.PluginMedia 并保留所有默认设置:
在 MainActivity 我已经覆盖了 OnRequestPermissionsResult 函数:
Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
file_paths.xaml 是:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_images" path="Pictures" />
<external-files-path name="my_movies" path="Movies" />
</paths>
在 AndroidManifest.xml 我添加了:
<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/file_paths"></meta-data>
打开预览的代码是这样的:
public void OpenPreviewFile(string FilePath)
{
Java.IO.File JavaFile = new Java.IO.File(FilePath);
Android.Net.Uri Path = FileProvider.GetUriForFile(global::Android.App.Application.Context, global::Android.App.Application.Context.PackageName + ".fileprovider", JavaFile);
string Extension = global::Android.Webkit.MimeTypeMap.GetFileExtensionFromUrl(Path.ToString());
string MimeType = global::Android.Webkit.MimeTypeMap.Singleton.GetMimeTypeFromExtension(Extension);
Intent Intent = new Intent(Intent.ActionView);
Intent.SetDataAndType(Path, MimeType);
Intent.AddFlags(ActivityFlags.GrantReadUriPermission);
Intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);
try
{
MainActivity.AppInstance.StartActivity(Intent.CreateChooser(Intent, TS.Translate("ANDROID_ScegliApp")));
}
catch (System.Exception)
{
Toast.MakeText(MainActivity.AppInstance, TS.Translate("ANDROID_ImpossibileAprireIlFIle"), ToastLength.Short).Show();
}
}
生成的文件在这个路径下:
Android/data/MY_PACKAGE_ID/files/GeneratedReports
我附上了一段视频来展示实际行为。
这里有一个样本
解决方案
我发现了问题。
在 中file_paths.xml
,节点的“路径”值必须以“/”开头,
所以有了这个节点:
<files-path name="GeneratedReports" path="/GeneratedReports" />
我的代码有效。
我还需要删除MyIntent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);
推荐阅读
- ffmpeg - 为什么 DASH 视频片段无法使用 ffmpeg 重现或读取?
- verilog - 出乎意料的波形出来了,设计CPU
- c# - 将 null 转换为类型时会发生什么
- python - 如何在烧瓶中调用另一个函数
- c# - 如何使用用户设置管理数百个配置文件 - AppSettings 与否?
- jquery - 缓存数据和 $.get 方法
- javascript - 如何通知 contenteditable 编辑器的粗体工具栏图标插入符号设置为粗体文本节点?
- javascript - 如何用浮点数将数字转换为字符串?
- scikit-learn - Sklearn 推出自己的估算器,检查估算器错误
- swift - 当一个发布者尚未发出时,如何让 combineLatest 发送一个值?