2012-11-21 27 views
1

我试图从URL下载图像,并将其转换成位图的Android位图,但行从URL总是空

Bitmap myBitmap = BitmapFactory.decodeStream(input); 

总是导致调试器跳到下面一行

return null; 

没有实际打印出堆栈跟踪,并且Exception变量在调试器中列出的变量中也不存在。我读了很多关于如何可能存在与实际导致图像的URL不一致的问题,格式不正确的图像等,但仍然存在与硬编码图像相同的问题,这是我积极的存在。

public static Bitmap getBitmapFromURL(String src) { 
    try { 
     URL url = new URL(
       "http://www.helpinghomelesscats.com/images/cat1.jpg"); 
     HttpURLConnection connection = (HttpURLConnection) url 
       .openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(input); 
     return myBitmap; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

由于好像manifest.xml文件可能涉及我编辑添加在这里。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.delivery" 
android:versionCode="1" 
android:versionName="1.0"> 

<uses-permission android:name="android.permission.CALL_PHONE"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".IntroPage" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".Browse"></activity> 
    <activity android:name=".ViewProduct"></activity> 
    <activity android:name=".ViewOrder"></activity> 
    <activity android:name=".GetAddress"></activity> 
    <activity android:name=".ConfirmOrder"></activity> 
</application> 

+3

你使用互联网的权限? – Nikhil

+1

请尝试查看已抛出的内容,可以使用Log.i(“TAG”,e.getMessage)记录IOexception并将其发布到 –

+0

如果调试器跳到'catch'中的'return null;'分支,那里_must_被抛出异常,变量'e'应该包含该异常。 – Ridcully

回答

3

以下为所有类型的图像的代码工作。

try { 

     URL url = new URL("http://www.helpinghomelesscats.com/images/cat1.jpg"); 
     InputStream in = url.openConnection().getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(in,1024*8); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 

     int len=0; 
     byte[] buffer = new byte[1024]; 
     while((len = bis.read(buffer)) != -1){ 
      out.write(buffer, 0, len); 
     } 
     out.close(); 
     bis.close(); 

     byte[] data = out.toByteArray(); 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
     imageView.setImageBitmap(bitmap); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

感谢您编写一个可靠的答案,它不会将InputStream传递到BitmapFactory。虽然我会建议重新缩进代码,因为它看起来不太好。 – dudeofea

0

嗨,你可以在Android manifeast文件

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

在你的活动给这些2个pemssions:

url="http://www.helpinghomelesscats.com/images/cat1.jpg" 
Bitmap bmp=readBitmapFromNetwork(url); 



public static Bitmap readBitmapFromNetwork(String imgurl) { 
     URL url; 
     Bitmap bmp = null; 
     InputStream is = null; 
      BufferedInputStream bis = null; 
      System.out.println("image url ========== "+imgurl); 
     try { 

      url=new URL(imgurl); 
      System.out.println("url.getPath()"+url.getPath());   
       try { 
       URLConnection conn = url.openConnection(); 
        conn.connect(); 
        is = conn.getInputStream(); 
        bis = new BufferedInputStream(is); 
       bmp = BitmapFactory.decodeStream(bis); 
       } catch (MalformedURLException e) {     
        System.out.println("Bad ad URL"); 
        e.printStackTrace(); 
       } catch (IOException e) {     
        System.out.println("Could not get remote ad image"); 
        e.printStackTrace(); 
       } 

     } catch (MalformedURLException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     finally { 
       try { 
        if(is != null) 
         is.close(); 
        if(bis != null) 
         bis.close(); 
       } catch (IOException e) { 
        System.out.println("Error closing stream."); 
        e.printStackTrace(); 
       } 
      } 


      return bmp; 
      } 
+0

该代码在'conn.connect();'行捕获一个异常,然后输出以下错误。 –

+0

11-21 10:34:34.554:W/System.err(818):java.net.UnknownHostException:主机未解决:www.helpinghomelesscats.com:80 –

0

这对我的作品,发现它在这里,而搜索出另一问题。这样它不会阻碍用户界面。在ArrayAdapters中也可以很好地工作。

用途:

_coverArt = (ImageView) row.findViewById(R.id.top_CoverArt); 

new DownloadImageTask(_coverArt) 
      .execute("Put your URL here Hint: make sure it's valid http://www.blah..."); 

的的AsyncTask

class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
ImageView bmImage; 

public DownloadImageTask(ImageView bmImage) { 
    this.bmImage = bmImage; 
} 

protected Bitmap doInBackground(String... urls) { 
    String urldisplay = urls[0]; 
    Bitmap mIcon11 = null; 
    try { 
     InputStream in = new URL(urldisplay).openStream(); 
     mIcon11 = BitmapFactory.decodeStream(in); 
    } catch (Exception e) { 
     Log.e("Error", e.getMessage()); 
     e.printStackTrace(); 
    } 
    return mIcon11; 
} 

protected void onPostExecute(Bitmap result) { 
    bmImage.setImageBitmap(result); 
} 
}