Android DownloadManager и SSL (https)

#android #ssl #https #download-manager

#Android #ssl #https #менеджер загрузок

Вопрос:

О, отлично. Всегда есть что-то еще, что некоторые… Гррр…

В любом случае, я работал дни напролет, разбираясь в расплывчатой, неполной и противоречивой информации Picasa, чтобы мое приложение для Android могло найти картинку Picasa и загрузить ее с помощью менеджера загрузок. Итак, только сейчас я внес последние штрихи и нажал кнопку «Выполнить». Все шло нормально, пока DownloadManager не попытался загрузить файл:

 java.lang.IllegalArgumentException: Can only download HTTP URIs: https://example.com/image.jpg
  

Скажи мне, что ты шутишь. Скажите мне, что они не создали менеджер загрузок, который не может обрабатывать SSL…

А еще лучше, скажите мне, как включить SSL-доступ в диспетчере загрузок Android.

Ответ №1:

У меня была такая же проблема ранее. Да, я вижу, что поддержка HTTPS уже есть в ICS, но не в 2.3.7 и ниже, но мы можем извлечь исходный код, чтобы создать DownloadManager для поддержки этого.

На основе примера кода из http://android-er.blogspot.com/2011/07/sample-code-using-androidappdownloadman.html я сделал демонстрацию с извлеченным DownloadManager для поддержки HTTPS.

Вы можете найти пример кода здесьhttps://github.com/alvinsj/android-https-downloadmanager-demo , запустите, просто изменив URL-адрес на ваш URL-адрес на основе https.

Комментарии:

1. не могли бы вы предоставить больше информации о поддержке HTTPS в ICS? Возможно, мне потребуется получить исходный код и заменить DownloadManager в 2.3.x

Ответ №2:

Да, кажется, что DownloadManager поддерживается HTTP только протокол: http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/java/android/app/DownloadManager.javaamp;exact_package=androidamp;q=Can only download HTTP URIsamp;type=csamp;l=343

Я тоже разочарован, поскольку я просто хотел использовать его на сайте HTTPS.

Комментарии:

1. К вашему сведению, текущий исходный код онлайн показывает, что он теперь поддерживает HTTPS. Я не проводил никаких экспериментов, чтобы узнать, когда была добавлена поддержка HTTPS.

2. Я думаю, что вы получили неработающую ссылку

Ответ №3:

Я нашел очень простое решение для этого:

request = new DownloadManager.Request(sourceUrl.replace("https://", "http://"))

На удивление сработало для всех URL-адресов https, которые я пробовал. Я не уверен в безопасности https, но исключений нет, и файл загружается правильно.

Комментарии:

1. Этот ответ не только предполагает, что сервер предоставляет контент как на порт 443, так и на порт 80 (что, скорее всего, не так), ему не удается отправить данные по защищенному соединению, в чем весь смысл SSL. Это не «работает» — код просто скрывает тот факт, что вы действительно загружаете с другого, небезопасного порта. Это как если бы я хотел поехать в Дувр в Соединенном Королевстве, но моя машина не может выбраться из Колорадо, США, поэтому вы делаете destination.replace("o", "en") и вау, я в пункте назначения! Но теперь я действительно в Денвере, а не в Дувре…

2. @GarretWilson На самом деле нет… Я уже протестировал то, что вы описали здесь. DownloadManager способен загружать защищенный контент с сайтов https. Единственная проблема заключается в ошибке в DownloadManager. Конструктор запроса (URL). Выполняется неправильная проверка. Итак, если вы укажете http URL, он внутренне перенаправит его на https. Я протестировал это, используя свой собственный сервер, где мы разрешаем только безопасные соединения. Это также можно проверить, открыв URL-адрес https в браузере с использованием http — он будет автоматически перенаправлен на сайт https.

3. Если ваш браузер перенаправляет с HTTP на HTTPS, это только потому, что ваш сервер настроен на прослушивание порта 80 и перенаправляет на порт 443. Возможно, вы говорите, что внутри DownloadManager знает, как следовать HTTP-перенаправлениям, и будет корректно подключаться к сайтам SSL, если он перенаправлен на один. Я этого не тестировал. Полезно знать для конкретных ситуаций, в которых вы управляете сервером, но нет гарантии, что все (или даже большинство) серверов будут настроены таким образом, поэтому это не общее решение.

4. если ваш контент предоставляется через http и https — в этом случае это хорошо для вас. но это нельзя считать обходным путем…