首页 > 解决方案 > 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

我附上了一段视频来展示实际行为。

视频

这里有一个样本

标签: c#xamarin.formsandroid-fileprovider

解决方案


我发现了问题。

在 中file_paths.xml,节点的“路径”值必须以“/”开头,

所以有了这个节点: <files-path name="GeneratedReports" path="/GeneratedReports" />我的代码有效。

我还需要删除MyIntent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);


推荐阅读