Как я могу скачать (с URL) apk с кнопкой в ​​xamarin android? - PullRequest
2 голосов
/ 09 июня 2019

Я использовал WebClient для загрузки файла в моем apk.Но я получил эту ошибку: Необработанное исключение:

System.Net.WebException: исключение произошло во время запроса WebClient.

И вот код, который я попробовал:

        {
            using (WebClient client = new WebClient())
            {

                    client.DownloadFile(
                        "https://code.org/images/social-media/code-2018-creativity.png",
                        @"j:\storage\emulated\legacy\Download\code-2018-creativity.png");


            }
        }   

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Вы должны спросить разрешения во время выполнения, даже если вы упомянули их в файле манифеста, если вы используете Android API уровня 23 или выше.

Посмотрите этот блог, который поможет узнать, как запросить разрешение во время выполнения: request-runtime-permissions-in-android

Кроме того, это официальный пример проверки RuntimePermissions

См .: xamarin-system-unauthorizedaccessexception-access-to-path-is-denied

Обновление:

Чтобы задать разрешения времени выполнения, вы можете использовать этот плагин: 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");
    }
}

Примечание: обратите внимание на ваш filePath, убедитесь, что ваш путь правильный, я использую:

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

Я обновил свой образец здесь: runtime-permission-xamarin.android

0 голосов
/ 09 июня 2019

Поскольку вы имеете в виду только WebException, это может быть связано с одним из следующих случаев:

  • URI, сформированный путем объединения BaseAddress и address, недопустим.
  • Файл или папка назначения не существует.Убедитесь, что ваш путь к папке назначения уже существует и у вас есть права доступа к нему.
  • Произошла ошибка при загрузке данных.

Если вы предоставите нам дополнительную информацию об исключениимы можем уменьшить ошибку до одного из этих случаев.Чтобы получить InnerException, вы можете сделать что-то вроде этого:

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