微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 举报,一经查实,本站将立刻删除。