2012-12-09 112 views
3

我是java和android開發的新手。我試圖找到這個問題的答案,但似乎這樣沒人問的是,是顯而易見的.. 我用這個例子來顯示圖像:如何在android中顯示bmp圖像

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    String str="http://logproj.500mb.net/image.php?id=8"; 
    ImageView imView; 
    imView = (ImageView)findViewById(R.id.image); 
    try{ 
    url = new URL(str); 
    } 
    catch(MalformedURLException e) 
    { 
      e.printStackTrace(); 
    } 
    try{ 
      HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
      conn.setDoInput(true); 

      conn.connect(); 
      int length = conn.getContentLength(); 

      int[] bitmapData =new int[length]; 
      byte[] bitmapData2 =new byte[length]; 

      InputStream is = conn.getInputStream(); 

      bmp = BitmapFactory.decodeStream(is); 
      imView.setImageBitmap(bmp); 
      } catch (IOException e) 
      { 
        e.printStackTrace(); 
      } 

} 

它的偉大工程爲JPG圖像,但我的形象是BMP和應用程序崩潰或「意外中止」。

我希望你能幫助解決這個問題。提前致謝。

+0

您是否試圖動態更改程序中的圖像,或者您是否希望修復圖像?如果圖像已修復,則不需要對其進行編程,只需將其放入res下的drawable-hdpi文件夾中,然後將該圖像設置爲佈局xml文件中的imgveiw即可。 – DrinkJavaCodeJava

+0

所以我嘗試了你所建議的一切,但沒有任何工作,但最終我找到了解決方案:http://www.androidhive.info/2012/07/android-loading-image-from-url-http/。這真的對我有用。 當我的問題得到很多好的答案時,我感到非常驚喜。在我問其他網站之前(例如俄羅斯的Google Baraza),但是這些網站並沒有專注於編程。非常感謝大家! – user1890184

回答

2

嘗試使用apaches Web客戶端。這應該工作。讓我知道。

public static Bitmap decodeFromUrl(HttpClient client, URL url, Config bitmapCOnfig) 
{ 
    HttpResponse response=null; 
    Bitmap b=null; 
    InputStream instream=null; 

    BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); 
    decodeOptions.inPreferredConfig = bitmapCOnfig; 
    try 
    { 
    HttpGet request = new HttpGet(url.toURI()); 
     response = client.execute(request); 
     if (response.getStatusLine().getStatusCode() != 200) 
     { 
      Log.d("Bad response on " + url.toString()); 
      Log.d("http response: " + response.getStatusLine().toString()); 
      return null; 
     } 
     BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(response.getEntity()); 
     instream = bufHttpEntity.getContent(); 

     return BitmapFactory.decodeStream(instream, null, decodeOptions); 
    } 
    catch (Exception ex) 
    { 
     Log.d("error decoding bitmap from:" + url, ex); 
     if (response != null) 
     { 
      Log.d("http status: " + response.getStatusLine().getStatusCode()); 
     } 
     return null; 
    } 
    finally 
    { 
     if (instream != null) 
     { 
      try { 
       instream.close(); 
      } catch (IOException e) { 
       Log.d("error closing stream", e); 
      } 
     } 
    } 
} 

不要忘記在異步任務中調用此函數。

+1

我完全抱歉 - 我沒有看到你會把最後一行放在你的文章中!這是我發佈的答案而不是評論:( –

0

請勿使用.bmp文件。改爲使用.png文件。或者.gif - 這在Android上不太可取,但確實有效。

2

首先 - 你不應該在主UI線程上運行http連接。在較新版本的Android中,這會拋出一個networkOnUIThreadException,導致一個關閉的力量。

我建議你寫一個AsyncTask在後臺線程上運行你的下載。通過WIIJBD編寫的decodeFromUrl看起來像它應該工作得很好,所以如果你們稱是函數,你能得到它回報你的位圖到UI線程onPostExecute(),並設置在ImageView的有

異步任務教程:http://www.vogella.com/articles/AndroidPerformance/article.html

任何更多的問題讓我知道

+1

+1)。是的異步任務是偉大的,我愛他們,並儘可能使用它們,如果有關。太多的人不會在他們應該使用的地方使用異步任務,而這僅僅是因爲糟糕的編程而導致「iPhone手機比android更平滑」的錯誤假設的一部分。事實上,任何一個都可以是平滑的或波濤洶涌的,但是android並沒有像蘋果那樣的硬標準和質量控制。 – WIllJBD

0

我已經有圖片的一些Android應用程序的工作,如果圖像是大型應用程序崩潰了很多,所以我用Google搜索,發現這個一個Android開發者網絡上,還不錯。

http://developer.android.com/training/displaying-bitmaps/index.html

我會推薦給你的是,你可以下載並保存圖像到外部存儲 - 根據您的記憶像SD卡,然後加載它,並顯示這個時候你可以減少它的質量用法。

此外,下載圖片在您的應用中非常耗時,因此最好將這些代碼放到另一個線程或AsyncTask(更好,IMO),這樣它不會在從互聯網下載它時停止UI主線程,之後它完成後你也可以顯示它。

希望它有幫助。