2011-06-30 116 views
0

我想從網絡上的照片創建一個位圖。 首先,我嘗試使用BitmapFactory.decodeStream,但由於錯誤(http://code.google.com/p/android/issues/detail?id=6066)而返回null。 現在我保存圖像然後使用BitmapFactory.decodeFile但它仍然返回空。BitmapFactory.decodeFile返回NULL

任何想法最新錯誤或爲另一種解決方法?

謝謝!

try { 
     URL uri = new URL("http://www.witzigundkraus.de/wp-content/uploads/2008/04/scooter-dj-munchen.jpg"); 
      URLConnection connection = uri.openConnection(); 
      Log.i(TAG, "connecting..."); 
      connection.connect(); 
      InputStream is = connection.getInputStream(); 
      //BufferedInputStream bis = new BufferedInputStream(is, 8 * 1024); 

      File myfile = new File(getApplicationContext().getCacheDir(), "wallpaper.tmp"); 
      myfile.createNewFile(); 
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(myfile)); 

      byte buf[]=new byte[1024]; 
      int len; 
      while((len=is.read(buf))>0) 
      out.write(buf,0,len); 
      out.close(); 
      is.close(); 


      Log.d(TAG, String.valueOf(myfile.exists())); 
      Bitmap bmp = BitmapFactory.decodeFile(myfile.getName()); 
      //Bitmap bmp = BitmapFactory.decodeStream(bis); 


      Log.i(TAG, "setting bitmap"); 

      Matrix matrix = new Matrix(); 
      int scale = canvas.getWidth()/bmp.getWidth(); 
      matrix.postScale(scale, scale, bmp.getWidth(), bmp.getHeight()); 
      //matrix.postScale(0.5F, canvas.getWidth()/bmp.getWidth()); 

      Bitmap bmp2 = Bitmap.createScaledBitmap(bmp, canvas.getWidth(), canvas.getHeight(), true); 

      Paint p = new Paint(); 
      p.setFilterBitmap(true); 


      try{ 
       canvas.drawBitmap(bmp2, matrix, p); 
      }catch(NullPointerException exc){ 
       //why do we get this?? 
       Log.d(TAG, "NullPointerException drawing canvas. why?"); 
       return; 
      } 


    } catch (MalformedURLException exc){ 
     Log.e(TAG, exc.toString()); 
     return; 
    } catch (IOException exc){ 
     Log.e(TAG, exc.toString()); 
     return; 
    } 










6-30 17:16:14.558 2253 2253 E AndroidRuntime: java.lang.NullPointerException 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at com.localfotos.MyWallpaperService$CubeEngine.drawCube(MyWallpaperService.java:212) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at com.localfotos.MyWallpaperService$CubeEngine.drawFrame(MyWallpaperService.java:159) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at com.localfotos.MyWallpaperService$CubeEngine.onSurfaceChanged(MyWallpaperService.java:109) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at android.service.wallpaper.WallpaperService$Engine.updateSurface(WallpaperService.java:543) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at android.service.wallpaper.WallpaperService$Engine.attach(WallpaperService.java:591) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:787) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:45) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at android.os.Looper.loop(Looper.java:136) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4425) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:521) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
06-30 17:16:14.558 2253 2253 E AndroidRuntime: at dalvik.system.NativeStart.main(Native Method) 
+0

啊,好吧,我必須使用'getPath'而不是'getName'( - : – nomoral

回答

1

傢伙,我也從我的應用程序下載互聯網圖像,它的工作很好。我用來下載的功能是:

public Bitmap download_Image(String url) { 
    Bitmap bm = null; 
    try { 
     URL aURL = new URL(url); 
     URLConnection conn = aURL.openConnection(); 
     conn.connect(); 
     InputStream is = conn.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     bm = BitmapFactory.decodeStream(bis); 
     bis.close(); 
     is.close(); 
    } catch (IOException e) { 
     Log.e("Hub","Error getting the image from server : " + e.getMessage().toString()); 
    } 
    return bm; 
} 

我設置了另一個線程來下載圖像,以便UI線程繼續可用。我用的AsyncTask(見here),這樣(簡化)doInBackground功能是一樣的東西:

@Override 
protected Void doInBackground(String... urls) { 
     return download_Image(urls[0]); 
} 

我覺得this page在Android的博客介紹了與此相關的問題以及一些東西。

相關問題