如何使用 Xamarin Android 中的存储访问框架从 URL 下载文件并保存到公共外部目录?

问题描述

目前,Xamarin Android 应用使用 GetExternalStoragePublicDirectory(自 API 级别 29 起已弃用)并启用 requestLegacyExternalStorage 以将文件从 Azure Blob 存储端点直接下载到下载目录中。

解决这个问题的官方方法是使用存储访问框架 (SAF) 并允许用户选择保存文件的目的地。注册一个依赖服务如下:

FileDownloader.cs

public void DownloadFile(string url,string fileName)
{
    Intent intent = new Intent(Intent.ActionCreateDocument);
    intent.AddCategory(Intent.CategoryOpenable);
    intent.PutExtra(Intent.ExtraTitle,fileName);
    intent.PutExtra("download_url",url);
    intent.SetType("application/pdf");

    var activity = MainActivity.Instance;
    activity.StartActivityForResult(intent,CREATE_PDF_REQUEST);
}

然后在onActivityResult中,处理请求代码和结果从url下载数据

MainActivity.cs

// rest of MainActivity.cs

protected override void OnActivityResult(int requestCode,Result resultCode,Intent data)
{
  base.OnActivityResult(requestCode,resultCode,data);

  try
  {
    switch (requestCode)
    {
      case CREATE_PDF_REQUEST:
        string url = data.GetStringExtra("download_url");
        Webclient client = new Webclient();
        client.DownloadFile(url,data.DataString);
        break;
      
      default:
        // do something
    }
  }
  catch (Exception ex)
  {
    //do something
  }
}

点击具有事件侦听器并调用依赖项服务的按钮时会激活流程,如下所示:

viewmodel.cs

DependencyService.Get<FileDownloaderInterface>().DownloadFile(url,fileName);

然而,url 始终为空。从而导致畸形的 Uri 异常。我在这里做错了什么?

另外,我想在 onActivityResult 中等待异步调用。是否可能或我必须运行 Task.Run(() => await client.DownloadFileAysnc())?

Xamarin 表单 4.6.0 版

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)