BitmapFactory.decodeFile返回null

我想从网络上的照片创建一个位图。 首先,我尝试使用BitmapFactory.decodeStream但由于存在错误而返回null(http://code.google.com/p/android/issues/detail?id=6066)。 现在我保存图像然后使用BitmapFactory.decodeFile但它仍然返回null。

任何想法是错误的还是其他解决方法?

谢谢!

  try { URL uri = new URL("http://sofzh.miximages.com/java/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) 

盖伊,我也在我的应用程序中从互联网上下载图像,它的工作正常。 我用来下载的function是:

 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(参见这里 ),以便(简化的) doInBackground函数类似于:

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

我认为android的博客上的这个页面解释了与此问题相关的一些内容。