2012-12-02 22 views
0

所以我一直在四处寻找关于如何将URL图片(.png)下载到手机上的解释itself-Android的Eclipse的从URL存储在手机

我有一个方法下载图像在菜单上选择一旦他们选择照片 - 它发送的URL路径以及文件名我希望它被称为(test.png暂时)

我想要做到这一点AsynC以及保持UI免费 -

下面的代码实际上关闭罚款,但它似乎并没有保存任何图像,虽然 - (我不有我的手机上的SD卡,但我想保存到测试数据文件夹,以及与相同的结果)

protected void saveImage(String imageUrl, String fileName){ 
    class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{ 
     private String imageUrl; 
     private String fileName; 
     public SendPostReqAsyncTask (String imageUrl, String fileName) 
     { 
      super(); 
      this.imageUrl=imageUrl; 
      this.fileName=fileName; 
     } 
     @Override 
     protected String doInBackground(String... params) { 
      String newfilename=""; 
      try { 
       File externalStorageDirectory = Environment.getExternalStorageDirectory(); 
       URL urlTmp = new URL(imageUrl); 
       newfilename = urlTmp.getFile(); 
       newfilename = externalStorageDirectory + "/" + fileName; 
       Bitmap bitmap = BitmapFactory.decodeStream(urlTmp.openStream()); 
       FileOutputStream fileOutputStream = new FileOutputStream(newfilename); 
       if (bitmap != null) { 
        bitmap.compress(CompressFormat.PNG, 50, fileOutputStream); 
        return newfilename; 
       } 
      } catch (MalformedURLException e) { 
       Log.w("errorSaving", "Could not save image with url: " + imageUrl, e); 
      } catch (IOException e) { 
       Log.w("errorSaving", "Could not save image with url: " + imageUrl, e); 
      } 
      Log.d("errorSaving", "Failed to save image " + fileName); 

      return newfilename; 
     } 

     //handle result when done 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      Toast.makeText(getApplicationContext(), "Photo saved to phone: " + result, Toast.LENGTH_LONG).show(); 
     } 
    } 
    SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask(imageUrl,fileName); 
    sendPostReqAsyncTask.execute();  
} 
+0

标准问题:您是否有权写入外部存储?如果是,您是否有权访问互联网?如果是的话,请解释你的代码失败的地方。 – 323go

+0

是的,我在清单中设置了权限,不幸的是我没有收到任何错误 - 代码运行,但它实际上并没有保存任何文件 – sykal

+0

逐行浏览您的代码。无论如何,如果你只是抛出警告(Log.w),你就不会有错误。第一个newFilename分配是多余的。这是显而易见的,就像一个不正确的url或一个缺少的fileName。 – 323go

回答

0
//To download image from a url 
Drawable image; 
try { 
    InputStream is   = (InputStream) this.fetch(your_image_url); 
    image     = Drawable.createFromStream(is,"src"); 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

//Convert drawable to Bitmap 
Bitmap bitmap = ((BitmapDrawable)image).getBitmap(); 

//Save Bitmap to a file 
try {image 
     FileOutputStream out = new FileOutputStream(filename); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
} catch (Exception e) { 
     e.printStackTrace(); 
} 

还要确保您设置Internet权限清单文件,

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

不幸的是Bitmap bitmap =((BitmapDrawable)image).getBitmap();以及this.fetch方法无法解析 – sykal