2015-09-26 116 views
17

我在嘗試使用API​​ Picasso保存圖像。要做到這一點,我試圖用Target來保存,但我無法完成這項工作。使用Picasso從url保存圖像?

我該怎麼做?

試圖

//save image 
    public static void imageDownload(Context ctx){ 
     Picasso.with(ctx) 
       .load("http://blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png") 
       .into(getTarget("http://blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png")); 
    } 

    //target to save 
    private static Target getTarget(final String url){ 
     Target target = new Target(){ 

      @Override 
      public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         //Log.i("PRODUTOS_FOLDER", CreateAppFolder.getProdutosFolder()); 
         File file = new File(Environment.getExternalStorageDirectory() + url); 

         try { 
          file.createNewFile(); 
          FileOutputStream ostream = new FileOutputStream(file); 
          bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream); 
          ostream.flush(); 
          ostream.close(); 
         } 
         catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }).start(); 

      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }; 
     return target; 
    } 

異常

java.io.IOException: open failed: ENOENT (No such file or directory) 
+1

你的問題究竟是什麼,回調不起作用,或者你的位圖沒有保存,或者其他什麼? –

+1

@VasylGlodan拋出異常'java.io.IOException:打開失敗:ENOENT(沒有這樣的文件或目錄)' – FernandoPaiva

+0

嗯,我不確定,但你的文件的路徑應該看起來像這樣'/ storage/emulated/0/http:// blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png',系統嘗試建立一個名爲'/storage/emulated/0/http://blog.concretesolutions的目錄。 com.br/wp-content/uploads/2015/04 /',但沒有這樣的目錄。嘗試從文件名中刪除所有特殊字符。 –

回答

21

已解決。現在工作正常!

我做

//save image 
    public static void imageDownload(Context ctx, String url){ 
     Picasso.with(ctx) 
       .load("http://blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png") 
       .into(getTarget(url)); 
    } 

    //target to save 
    private static Target getTarget(final String url){ 
     Target target = new Target(){ 

      @Override 
      public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { 
       new Thread(new Runnable() { 

        @Override 
        public void run() { 

         File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + url); 
         try { 
          file.createNewFile(); 
          FileOutputStream ostream = new FileOutputStream(file); 
          bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream); 
          ostream.flush(); 
          ostream.close(); 
         } catch (IOException e) { 
          Log.e("IOException", e.getLocalizedMessage()); 
         } 
        } 
       }).start(); 

      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }; 
     return target; 
    } 
+0

它給了我錯誤:打開失敗:EACCES(權限被拒絕)。在清單上我已經聲明 AEMLoviji

+0

@AEMLoviji首先使用'Environment.getExternalStorageState == Environment.MEDIA_MOUNTED'檢查外部存儲狀態 – NineToeNerd

+0

爲什麼不把hash圖像url和將其轉換爲長整數,用於生成文件名? – zyamys

2

我可以看到2個可能出現的問題:

  1. 試圖保存到外部存儲沒有寫權限在您的清單
  2. 嘗試更改文件名,以便它不是整個網址,這可能是您的問題,因爲您的網址中的字符不能作爲文件名字符有效。
+0

我使用了這段代碼。並在我的Android清單我decalred permision爲:。和文件名是simle:「simpleFileName」。現在,當我試圖保存它時,它給了我錯誤:java.io.IOException:打開失敗:EACCES(權限被拒絕)。我能做什麼? – AEMLoviji

0

我認爲你需要檢查你是否真正要求的權限。 在Android中,從版本6.0開始,權限是動態的。要麼你必須在運行時請求它,要麼只是將你的targetSdk版本降級到22.