2011-01-05 11 views
9
 
public class TestButton extends Activity { 
    /** Called when the activity is first created. */ 
    ImageButton imgBtn; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     imgBtn = (ImageButton) findViewById(R.id.image); 
     //String url = "http://thenextweb.com/apps/files/2010/03/google_logo.jpg"; 
     String url1 = "http://trueslant.com/michaelshermer/files/2010/03/evil-google.jpg"; 
     Drawable drawable = LoadImage(url1); 
     imgBtn.setImageDrawable(drawable); 
    } 

    private Drawable LoadImage(String url) { 
     try { 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "src"); 
      return d; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 

ऊपर कोड स्निपेट है जिसे मैं छवि से वेब छवि में छवि लोड करने के लिए उपयोग करता हूं। अधिकांश छवियां प्रदर्शित होती हैं, लेकिन उपरोक्त की तरह कुछ यूआरएल i.e. url1, Drawable.createFromStream शून्य देता है !! इसका कारण क्या है और इससे बचने या इस समस्या को दूर करने का क्या कारण है?एंड्रॉइड में CreateFromStream कुछ यूआरएल

उत्तर

12

आज मैंने एक ही समस्या पर ठोकर खाई है। और एक जवाब मिला, सौभाग्य से :) bug in SDK, described more or less on that google groups thread है।

वर्कअराउंड कि मेरे लिए काम किया है:

 private static final int BUFFER_IO_SIZE = 8000; 

    private Bitmap loadImageFromUrl(final String url) { 
     try { 
      // Addresses bug in SDK : 
      // http://groups.google.com/group/android-developers/browse_thread/thread/4ed17d7e48899b26/ 
      BufferedInputStream bis = new BufferedInputStream(new URL(url).openStream(), BUFFER_IO_SIZE); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      BufferedOutputStream bos = new BufferedOutputStream(baos, BUFFER_IO_SIZE); 
      copy(bis, bos); 
      bos.flush(); 
      return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.size()); 
     } catch (IOException e) { 
      // handle it properly 
     } 
    } 

    private void copy(final InputStream bis, final OutputStream baos) throws IOException { 
     byte[] buf = new byte[256]; 
     int l; 
     while ((l = bis.read(buf)) >= 0) baos.write(buf, 0, l); 
    } 

और, एक से अधिक 8k के लिए बफर आकार निर्धारित करने के लिए नहीं है, क्योंकि ओएस के बजाय आप सेट (बेशक कि प्रवेश करने से एक का डिफ़ॉल्ट आकार का उपयोग करेगा यह सुनिश्चित कर लें, लेकिन मुझे यह ध्यान देने में थोड़ी देर लग गई;))।

+0

उपयोग कर रहा है बग एंड्रॉयड के 1.0 संस्करण में था, यह अभी भी 2.x में चारों ओर है? मेरे परीक्षणों में यह मामला प्रतीत होता है, लेकिन मैं Google से आधिकारिक पुष्टि की तलाश में हूं। साथ ही, आपके कोड में आप BUFFER_IO_SIZE को सेट करते हैं? – ThomasW

+0

@ थॉमस डब्ल्यू निश्चित रूप से नहीं बता सकता है। मुझे दो चीजों के बारे में निश्चित जानकारी है कि यह वही व्यवहार है और उसी फिक्स ने 2.1 और 2.2 में एम्यूलेटर और डिवाइस दोनों पर मेरे लिए काम किया है। मैं BUFFER_IO_SIZE मान को शामिल करने के लिए अपना उत्तर अपडेट करूंगा। – mcveat

+0

समाधान के लिए धन्यवाद, यह काम करता है। – sat

संबंधित मुद्दे