问题描述
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
功能。