2013-12-05 2 views
1

Я написал программу под AsyncTask, чтобы загрузить изображение из Интернета и показать в ImageView. Программа отлично работает, если я даю ссылку на прямой образ, но не работаю с ссылками API.Загрузка изображения в ImageView из OpenLibrary API

То, что я имею в виду, например, to have the cover of Farmer Boy from OpenLibrary, мне нужно дать ниже источника в HTML или в браузере: http://covers.openlibrary.org/b/isbn/9780385533225-S.jpg

Однако, если я вхожу выше ссылку в браузере, браузер перенаправляет ниже адресу. http://ia700804.us.archive.org/zipview.php?zip=/12/items/olcovers4/olcovers4-M.zip&file=49855-M.jpg

Моя проблема заключается в том, что мой код работает с последним, но не с первым.

Как я могу получить изображение (в приложении для Android), используя первую ссылку?

КОД:

private class getImageOpenLibrary extends AsyncTask<String, Void, Bitmap> 
    { 
     protected Bitmap doInBackground(String... args) { 
      URL newurl = null; 
      try { 
       //newurl = new URL("http://covers.openlibrary.org/b/isbn/"+args[0]+"-M.jpg"); // THIS DOES NOT WORK, args[0] = 9780064400039 
       newurl = new URL("http://ia700804.us.archive.org/zipview.php?zip=/12/items/olcovers4/olcovers4-M.zip&file=49855-M.jpg"); //THIS WORKS 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      Bitmap mIcon_val = null; 
      try { 
       mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return mIcon_val; 
     } 

     //@Override 
     protected void onPostExecute(Bitmap result1) 
     { 
      ImageView mImageView = (ImageView) findViewById(R.id.cover); 
      mImageView.setImageBitmap(result1); 
     } 
    } 
+0

Вы могли бы хотеть рассмотреть библиотеку как ИЮОЖ (https://github.com/nostra13/Android-Universal-Image-Loader) или Пикассо (https://github.com/square/picasso) для таких интенсивных образ загрузки. – Hein

ответ

1

Вы должны обращаться с перенаправлением. URL перенаправляется на другой URL. Вы должны открыть второе соединение по URL-адресу переадресации. Чтобы получить URL-адрес переадресации, установите setInstanceFollowRedirects на false в соединении и прочитайте Location в полях заголовка.

URL url = new URL("http://covers.openlibrary.org/b/isbn/9780385533225-S.jpg"); 
HttpURLConnection firstConn = (HttpURLConnection) url.openConnection(); 
firstConn.setInstanceFollowRedirects(false); 
URL redirectURL = new URL(firstConn.getHeaderField("Location")); 
URLConnection redirectConn = redirectURL.openConnection(); 
Bitmap bitmap = BitmapFactory.decodeStream(redirectConn.getInputStream()); 
Смежные вопросы