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

Posted

技术标签:

【中文标题】如果我有内容 URI 而不是路径,是不是可以在 Android 中使用 Xamarin.Essentials.Launcher 启动文件?【英文标题】:Is it possible in Android to launch a file using Xamarin.Essentials.Launcher if I have a content URI instead of a path?如果我有内容 URI 而不是路径,是否可以在 Android 中使用 Xamarin.Essentials.Launcher 启动文件? 【发布时间】:2021-05-30 07:27:21 【问题描述】:
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)。

【问题讨论】:

你想用这个代码打开互联网文件的url吗? 【参考方案1】:

我自己找到了解决方案。如果“路径”是内容 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 功能添加到您的应用中。

【讨论】:

以上是关于如果我有内容 URI 而不是路径,是不是可以在 Android 中使用 Xamarin.Essentials.Launcher 启动文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中使用数据 URI 而不是小于 10kb 的图像的路径的原因是啥?

如何从 URI 获取完整的文件路径

路径部分中带有 // 的 URL 是不是有效?

istio 是不是可以通过 uri 路径的动态部分支持到不同服务的路由

如何在Android中重命名文件只知道它的媒体内容Uri

检查路径在 Python 中是不是有效,而不在路径的目标处创建文件