2015-09-26 2 views
17

Sto provando a salvare un'immagine utilizzando l'API Picasso. Per farlo, sto cercando di usare Target per salvare ma non posso farlo.Salvare l'immagine dall'URL usando Picasso?

Come posso fare questo?

Cercando

//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; 
    } 

Eccezione

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

E qual è il problema, callback non funziona o la bitmap non viene salvata o altro? –

+1

@VasylGlodan fa eccezione 'java.io.IOException: open failed: ENOENT (Nessun file o directory simile)' – FernandoPaiva

+0

Hm, non sono sicuro, ma il percorso del file dovrebbe apparire come questo '/ storage/emulato/0/http: // blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png', e il sistema prova a trovare la directory denominata '/storage/emulated/0/http://blog.concretesolutions. com.br/wp-content/uploads/2015/04/', ma non esiste tale directory. Prova a rimuovere tutti i caratteri speciali dal nome del file. –

risposta

21

Risolto. ora funziona bene!

ho fatto

//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

mi dà errore: open failed: EACCES (autorizzazione negata). su manifest ho dichiarato AEMLoviji

+0

@AEMLoviji Controlla lo stato di archiviazione esterna prima utilizzando 'Environment.getExternalStorageState == Environment.MEDIA_MOUNTED' – NineToeNerd

+0

Perché non hash l'URL immagine e convertirlo in un numero intero lungo, allo scopo di generare un nome file? – zyamys

2

posso vedere 2 problemi possibili:

  1. cercando di salvare nella memoria esterna, senza permessi di scrittura nella tua manifesta
  2. prova a cambiare il nome del file in modo che non sia l'intero URL, che potrebbe essere il tuo problema a causa dei caratteri nel tuo url che non sono validi come caratteri del file.
+0

ho usato questo codice. E sul mio manifest Android ho decodificato la permissione come: . e filename è simle: "simpleFileName". E ora quando sto cercando di salvarlo mi dà errore: java.io.IOException: open failed: EACCES (autorizzazione negata). cosa posso fare? – AEMLoviji

0

Penso che avete bisogno di controllare se in realtà si sta richiedendo il permesso. In Android le autorizzazioni sono dinamiche a partire dalla versione 6.0. O è necessario richiederlo in fase di esecuzione o semplicemente eseguire il downgrade della versione targetSdk a 22.