如何在 xamarin Android 中下载(从 URL)带有按钮的 apk



我用WebClient在我的apk中下载了一个文件。但是我得到了这个错误:未处理的异常:

System.Net.WebException:在 WebClient 请求期间发生异常。

这是我尝试过的代码:

        {
            using (WebClient client = new WebClient())
            {
                
                    client.DownloadFile(
                        "https://code.org/images/social-media/code-2018-creativity.png",
                        @"j:storageemulatedlegacyDownloadcode-2018-creativity.png");
                
                
            }
        }   

由于您仅引用 WebException,因此它可能与以下情况之一有关:

  • BaseAddressaddress组合形成的 URI 无效。
  • 文件或目标文件夹不存在。确保你的路径目标文件夹已存在,并且您有权访问它。
  • 发生错误时下载数据。

如果您向我们提供有关异常的更多信息,我们可能能够将错误减少到这些情况之一。要获得InnerException,您可以执行以下操作:

{
  using (WebClient client = new WebClient ())
  {
    try
    {
      client.DownloadFile (
        "https://code.org/images/social-media/code-2018-creativity.png",
        @"j:storageemulatedlegacyDownloadcode-2018-creativity.png");
    }
    catch (Exception ex)
    {
      while (ex != null)
      {
        Console.WriteLine (ex.Message);
        ex = ex.InnerException;
      }
    }
  }
}

如果您运行的是 Android API 级别 23 或更高版本,即使您在清单文件中提到了它们,您也必须在运行时请求权限。

看看这个博客会帮助你了解如何询问运行时权限:requesting-runtime-permissions-in-android

此外,这是如何检查运行时权限的官方示例

参考: xamarin-system-unauthorizedaccessexception-access-access-to-the-path-is-deny

更新:

要询问运行时权限,您可以使用此插件:Plugin.Permissions,将其安装到您的项目中。

然后,在下载文件之前致电CheckMyPermissionAsync();

private void FabOnClick(object sender, EventArgs eventArgs)
{
    View view = (View) sender;
    CheckMyPermissionAsync();
}

在方法 CheckMyPermissionAsync() 中,检查您的存储权限,然后下载文件:

 public async void CheckMyPermissionAsync()
        {
            var permissionsStartList = new List<Permission>()
            {
                Permission.Storage
            };
            var permissionsNeededList = new List<Permission>();
            try
            {
                foreach (var permission in permissionsStartList)
                {
                    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
                    if (status != PermissionStatus.Granted)
                    {
                        permissionsNeededList.Add(permission);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            var results = await CrossPermissions.Current.RequestPermissionsAsync(permissionsNeededList.ToArray());
            //Check the persimmison again
            var storeagePermission = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
            if (storeagePermission == PermissionStatus.Granted)
            {
                //Download file here
                DownloadFile("http://www.dada-data.net/uploads/image/hausmann_abcd.jpg", "XF_Downloads");
            }
            else {
                Console.WriteLine("No permissions");
            }         
        }

您可以在已完成的事件中检查结果:

private void Completed(object sender, AsyncCompletedEventArgs e)
{
    if (e.Error != null)
    {
        Console.WriteLine("success");
    }
    else
    {
        if (OnFileDownloaded != null) { }
        Console.WriteLine("fail");
    }
}
注意:注意你的文件路径,

确保你的路径正确,我使用:

string pathToNewFolder = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, folder);

在这里更新了我的示例:runtime-permission-xamarin.android

相关内容

  • 没有找到相关文章

最新更新