2015-09-26 38 views
17

Próbuję zapisać obraz przy użyciu interfejsu API Picasso. Aby to zrobić, próbuję użyć Target, aby zapisać, ale nie mogę wykonać tej pracy.Zapisywanie obrazu z adresu URL przy użyciu Picassa?

Jak mogę to zrobić?

Próbując

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

Wyjątek

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

Jaki jest dokładnie Twój problem, wywołanie zwrotne nie działa, czy Bitmapa nie jest zapisana, czy cokolwiek innego? –

+1

@VasylGlodan generuje wyjątek 'java.io.IOException: open failed: ENOENT (Brak takiego pliku lub katalogu)' – FernandoPaiva

+0

Hm, nie jestem pewien, ale ścieżka twojego pliku powinna wyglądać tak: '/ storage/emulated/0/http: // blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png', a system próbuje znaleźć katalog o nazwie '/storage/emulated/0/http://blog.concretesolutions. com.br/wp-content/uploads/2015/04/', ale nie ma takiego katalogu. Spróbuj usunąć wszystkie znaki specjalne z nazwy pliku. –

Odpowiedz

21

Rozwiązany. teraz działa dobrze!

zrobiłem

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

daje mi błąd: otwarte nie powiodło się: EACCES (odmowa uprawnień). na manifeście zadeklarowałem AEMLoviji

+0

@AEMLoviji Sprawdź stan zewnętrznej pamięci najpierw używając 'Environment.getExternalStorageState == Environment.MEDIA_MOUNTED' – NineToeNerd

+0

Dlaczego nie hash URL obrazu i przekształcić go w długą liczbę całkowitą, w celu wygenerowania nazwy pliku? – zyamys

2

widzę 2 możliwe problemy:

  1. próbuje zapisać do pamięci zewnętrznej bez uprawnień zapisu w swoim manifeście
  2. spróbuj zmienić nazwę pliku, aby nie był to cały adres URL, który może być Twoim problemem z powodu znaków w twoim url, które nie są prawidłowe jako nazwy plików.
+0

użyłem tego kodu. I na moim manifeście Android mam przypisane uprawnienia: . a nazwa pliku jest simle: "simpleFileName". A teraz, gdy próbuję go zapisać, pojawia się błąd: java.io.IOException: open failed: EACCES (odmowa uprawnień). co mogę zrobić? – AEMLoviji

0

myślę, że trzeba by sprawdzić, czy rzeczywiście wnioskiem o pozwolenie. W systemie Android uprawnienia są dynamiczne, począwszy od wersji 6.0. Możesz zażądać go w czasie wykonywania lub po prostu obniżyć wersję docelową programu do wersji 22.