Как я могу загрузить (с URL-адреса) apk с помощью кнопки в xamarin android?

Я использовал 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");


            }
        }   

person DonAlex1897    schedule 09.06.2019    source источник
comment
Можете ли вы предоставить нам более подробную информацию об исключении? (возможно, InnerException поможет)   -  person Florin-Constantin Ciubotariu    schedule 09.06.2019
comment
Я получил это из консоли: 06-09 18:29:56.662 I/mono-stdout(3959): Исключение произошло во время запроса WebClient. Доступ к пути /j:\storage\emulated\legacy\Download\code-2018-creativity.png запрещен.   -  person DonAlex1897    schedule 09.06.2019
comment
У вас есть какие-нибудь идеи @CiubotariuFlorin?   -  person DonAlex1897    schedule 10.06.2019
comment
Какую версию Android вы используете?   -  person Florin-Constantin Ciubotariu    schedule 10.06.2019
comment
мой minSdkVersion настроен на API 16 @CiubotariuFlorin.   -  person DonAlex1897    schedule 10.06.2019


Ответы (2)


Поскольку вы имеете в виду только 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;
      }
    }
  }
}
person Diogo Rocha    schedule 09.06.2019
comment
Я получил это из консоли: 06-09 18:29:56.662 I/mono-stdout(3959): Исключение произошло во время запроса WebClient. Доступ к пути /j:\storage\emulated\legacy\Download\code-2018-creativity.png запрещен. Что мне теперь делать? - person DonAlex1897; 09.06.2019
comment
Я изменил путь на: @j:\sdcard\code-2018-creativity.png и добавил следующие разрешения в манифест: ‹uses-permission android:name=android.permission.WRITE_EXTERNAL_STORAGE /› ‹uses-permission android:name=android .permission.READ_EXTERNAL_STORAGE /› но это не помогло. - person DonAlex1897; 09.06.2019
comment
У тебя есть идеи @DiogoRocha? - person DonAlex1897; 10.06.2019

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

Посмотрите этот блог, который поможет узнать, как запросить разрешение во время выполнения: запрос разрешений во время выполнения в Android

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

См.: путь запрещен

Обновление:

Чтобы запросить разрешения во время выполнения, вы можете использовать этот подключаемый модуль: 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

person Jack Hua    schedule 10.06.2019
comment
Я прочитал ссылки, на которые вы ссылались, но извините @JackHua, я действительно не понял, что мне теперь делать. - person DonAlex1897; 10.06.2019
comment
@mohamadaminkaviyani Я поделюсь с вами образцом, чтобы сказать вам, что вы должны делать. Я обновлю его позже. - person Jack Hua; 10.06.2019
comment
большое спасибо @JackHua. Я только что проверил приложение на своем телефоне (прошлые результаты были взяты из эмулятора), и оно даже не запустилось :| - person DonAlex1897; 10.06.2019
comment
@mohamadaminkaviyani Смотрите мой отредактированный ответ. Дайте мне знать, если это работает для вас. - person Jack Hua; 10.06.2019
comment
Большое спасибо @JackHua. Проблема решена, но у меня была досадная ошибка: @j:\storage\emulated\legacy\Download\code-2018-creativity.png Правильная форма: @j:/storage/emulated/legacy/Download/code- 2018-креативность.png - person DonAlex1897; 10.06.2019
comment
@mohamadaminkaviyani Не могли бы вы принять этот ответ, если он вам полезен? Мы можем помочь большему количеству людей с той же проблемой! - person Jack Hua; 11.06.2019