#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
мне нужно обрабатывать перенаправление, я использовал ссылку в своем редактировании ответа.