首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android和iOS上下载一个使用Xamarin.Forms公开可用的文件?

如何在Android和iOS上下载一个使用Xamarin.Forms公开可用的文件?
EN

Stack Overflow用户
提问于 2020-07-10 17:01:55
回答 1查看 918关注 0票数 0

看看这个问题,扎马林/要点#1322,我如何下载一个文件在安卓(版本6-10,Api 23-29 )和iOS (版本13.1+ )是公开的(可共享的其他应用程序,如Microsoft )。我不需要给其他应用程序的写访问权,只要阅读是可以的,如果它必须受到限制。

我得到以下例外:

代码语言:javascript
复制
    [Bug] Android.OS.FileUriExposedException: file:///data/user/0/{AppBundleName}/cache/file.doc exposed beyond app through Intent.getData() 

下面的代码。

代码语言:javascript
复制
    public static string GetCacheDataPath( string fileName ) => Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory, fileName);
    public static FileInfo SaveFile( string filename, Uri link )
    {
        using var client = new WebClient();
        string path = GetCacheDataPath(filename);
        DebugTools.PrintMessage(path);
        client.DownloadFile(link, path);
        return new FileInfo(path);
    }
    public async Task Test(Uri link)
    {
        LocalFile path = await SaveFile("file.doc", link).ConfigureAwait(true);
        var url = new Uri($"ms-word://{path.FullName}", UriKind.Absolute);
        await Xamarin.Essentials.Launcher.OpenAsync(url).ConfigureAwait(true);
    }

使用这个回答,我创建了一个FileService接口,它可以处理本地私有文件,但是我无法共享这些文件。从Android (10 / Api 29)开始,下面是不推荐的。

代码语言:javascript
复制
    string path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;  // deprecated

我得到以下例外:

代码语言:javascript
复制
System.UnauthorizedAccessException: Access to the path '/storage/emulated/0/Download/file.doc' is denied. ---> System.IO.IOException: Permission denied

我还没有找到任何途径,为安卓10与Xamarin.Forms的公共路径。我看过用于内容提供者的Android文档,但它是用Java编写的,我还不能让它在C#中工作。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-29 17:31:41

我确实找到了一个解决方案

找到了一个修复 适用于Android public Task DownloadFile( Uri链接,string fileName ){ if (链接为空)抛出新的ArgumentNullException(nameof( link ));使用System.Net.WebClient client = new System.Net.WebClient();// MainActivity是加载应用程序的类。// MainActivity.Instance是在OnCreate中设置"Instance = this;“的属性。MainActivity.Instance.GetExternalFilesDir(MediaStore.Downloads.ContentType);root = global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity string path = Path.Combine(root.AbsolutePath,fileName);client.DownloadFile(链接,路径);返回Task.FromResult(新链接(Path));}公共类MainActivity :global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity{内部静态MainActivity实例{ get;私有集;}受保护的重写void (Bundle savedInstanceState) {.实例=此;}.} 对于iOS 公共Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory,Task DownloadFile( Uri链接,字符串fileName) { if (链接为空)抛出新ArgumentNullException(链接);使用System.Net.WebClient client = new System.Net.WebClient();string path =ArgumentNullException fileName client.DownloadFile(链接,路径);返回Task.FromResult(新路径);} public异步任务共享(){ // back在共享项目中,选择一个文件名并传递链接。System.IO.FileInfo info =等待DependencyService.Get().DownloadFile(新Uri("",“file.doc”).ConfigureAwait(真);ShareFile shareFile =新ShareFile(info.FullName,"doc");//输入文件类型/扩展名。var ShareFileRequest=新ShareFileRequest(“选择应用程序打开文件”,shareFile);等待shareFile} 请注意,对于iOS,由于苹果的无限智慧..。我不能像在Android上那样直接与另一个应用程序共享文件。沙箱对安全性有好处,但在本例中,如何实现沙箱限制了选项。两个应用程序都必须在"App Group“中预注册/预分配才能直接共享文件。有关更多信息,请参见此文章苹果文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62839083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档