如果我有内容 URI 而不是路径,是否可以在 Android 中使用 Xamarin.Essentials.Launcher 启动文件?

问题描述

using Xamarin.Essentials;

namespace myNamespace
{
    class myClass
    {
        public async void OpenFile(string path)
        {
            await Launcher.OpenAsync(new OpenFileRequest("File",new ReadOnlyFile(path)));
        }
    }
}

如果 path一个真实的文件系统路径,它工作得很好,如果它是一个 URI,它就不起作用,给出如下错误

System.IO.DirectoryNotFoundException:'找不到路径“content://com.android.providers.downloads.documents/something”的一部分。'

(我使用 Xamarin.Plugin.FilePicker 获取 path,因此它应该一个真实的文件,但有时 FilePicker 返回 URI 而不是路径。例如,如果我从相机中选择一个图像,它返回一个路径,如果我从下载中选择一个文件,它返回一个 URI)。

解决方法

我自己找到了解决方案。如果“路径”是内容 URI,则可以使用 ActionView 意图启动文件。

namespace myNamespace
{
    class myClass
    {
        public void OpenFile(string path)
        {
            var uri = Android.Net.Uri.Parse(path);
            var intent = new Intent(Intent.ActionView,uri);
            intent.AddFlags(ActivityFlags.GrantReadUriPermission);
            if (intent.ResolveActivity(Activity.PackageManager) != null)
                StartActivity(intent);
        }
    }
}

如果是路径,则您的应用必须是 FileProvider 才能使用此方法,如下所述:android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()

在这种情况下,请使用 Xamarin.Essentials.Launcher,因为它为您的应用添加了 FileProvider 功能。