Android, получить входной поток для рассмотрения перенаправления

#java #android

#java #Android

Вопрос:

Я использую этот класс для загрузки изображения пользователя из социальных сетей:

 class RetrieveImageTask extends AsyncTask<String, Void, Bitmap> {

        protected Bitmap doInBackground(String... url) {
            try {
                URL bitMapURL = new URL(url[0]);
                HttpURLConnection connection = (HttpURLConnection) bitMapURL.openConnection();
                InputStream is = connection.getInputStream();
                return BitmapFactory.decodeStream(is);
            } catch (Exception e) {
                Log.d(TAG, e.getMessage());
                return null;
            }
        }

        protected void onPostExecute(Bitmap img) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            img.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            // Do something here with the stream
        }
  

Это URL-адрес для повторного просмотра изображения профиля Facebook:

 new RetrieveImageTask().execute("https://graph.facebook.com/"   userFacebookId   "/picture?type=large");
  

По какой-то причине загрузка завершается неудачно, теперь я Log отправляю URL-адрес и отправляю его в chrome, и происходит перенаправление на другой URL-адрес, содержащий изображение, поэтому, возможно, вместо BitmapFactory того, чтобы декодировать поток для фактического изображения, он декодирует для перенаправления.

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

Редактировать:

После просмотра этого веб-сайта я connection.getResponseCode() отредактировал код, при просмотре кода состояния ( 200 ) я получаю для этого URL: https: //graph.facebook.com/123164414764748/picture?type=large, при использовании chrome network inspector:

 Request URL:https://graph.facebook.com/123164414764748/picture?type=large
Request Method:GET
Status Code:302 
Remote Address:31.13.90.2:443
  

НО: при первоначальном использовании http и не https connection.getResponseCode() возвращается 302 .

Хотя все эти факты хороши, при получении полного (после перенаправления) URL-адреса и его жестком кодировании просто для проверки, не может ли перенаправление быть проблемой, похоже, что это не так, по причине, которую я пока не выяснил, изображение не загружается.

Решаемая: это была проблема с именем файла, я использую Parse-server и использовал электронные письма пользователей в качестве имен файлов, facebook позволяет вам регистрироваться на телефоне, поэтому null или что-то подобное вернулось в качестве имени файла, и он не смог загрузить файл.

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

1. Вы пытались выполнить followRedirect(true) соединение?

2. @Robert Внутри нет followRedirect метода HttpURLConnection , где я должен его вызвать?

3. а как насчет setFollowRedirects() ?

4. @Robert спасибо, это было setInstanceFollowRedirects(true)

5. @Robert просто хотел сообщить вам, что использование setInstanceFollowRedirects(true) — это не то же самое, что использование кода в ссылке в моем редактировании, setInstanceFollowRedirects(true) не работало, пока код работал.

Ответ №1:

HttpURLConnection не обрабатывает перенаправление. Вам нужно сделать это вручную. Это означает проверку кодов 30x состояния, чтение URL перенаправления и выполнение второго запроса.

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

1. Пожалуйста, проверьте мое редактирование, я сделал, и похоже, что это не перенаправление.

2. Это, безусловно, так и есть, и это происходит по умолчанию.

3. Спасибо, Алекс, при использовании http мне нужно обрабатывать перенаправление, я использовал ссылку в своем редактировании ответа.