2015-09-26 23 views
17

Tôi đang cố gắng lưu hình ảnh bằng API Picasso. Để làm điều đó tôi đang cố gắng sử dụng Target để tiết kiệm nhưng tôi không thể làm công việc này.Lưu hình ảnh từ url bằng Picasso?

Tôi làm cách nào để thực hiện việc này?

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

Exception

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

Và vấn đề của bạn là gì, gọi lại không hoạt động hoặc Bitmap của bạn không được lưu hoặc bất kỳ thứ gì khác? –

+1

@VasylGlodan không ném ngoại lệ 'java.io.IOException: mở không thành công: ENOENT (Không có tệp hoặc thư mục nào)' – FernandoPaiva

+0

Hm, tôi không chắc chắn nhưng đường dẫn tệp của bạn sẽ trông như thế này '/ storage/emulated/0/http: // blog.concretesolutions.com.br/wp-content/uploads/2015/04/Android1.png' và hệ thống cố tìm thư mục có tên '/storage/emulated/0/http://blog.concretesolutions. com.br/wp-content/uploads/2015/04/', nhưng không có thư mục nào như vậy. Cố gắng loại bỏ tất cả các ký tự đặc biệt khỏi tên tệp. –

Trả lời

21

Đã giải quyết. bây giờ hoạt động tốt!

tôi đã làm

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

nó cho tôi lỗi: mở không thành công: EACCES (Quyền bị từ chối). trên tệp kê khai tôi đã khai báo AEMLoviji

+0

@AEMLoviji Kiểm tra trạng thái lưu trữ bên ngoài trước tiên bằng cách sử dụng 'Environment.getExternalStorageState == Environment.MEDIA_MOUNTED' – NineToeNerd

+0

Tại sao không băm url hình ảnh và chuyển đổi nó thành một số nguyên dài, cho mục đích tạo ra một tên tập tin? – zyamys

2

tôi có thể thấy 2 vấn đề có thể:

  1. cố gắng tiết kiệm để lưu trữ bên ngoài mà không cần quyền ghi trong biểu hiện của bạn
  2. hãy thử thay đổi tên tệp để không phải là toàn bộ url, có thể là vấn đề của bạn vì các ký tự trong url của bạn không hợp lệ như ký tự tên tệp.
+0

tôi đã sử dụng mã này. Và trên bản kê khai android của tôi, tôi có sự can thiệp decalred như: . và tên tệp là simle: "simpleFileName". Và bây giờ khi tôi đang cố gắng để lưu nó nó mang lại cho tôi lỗi: java.io.IOException: mở không thành công: EACCES (Quyền bị từ chối). tôi có thể làm gì? – AEMLoviji

0

Tôi nghĩ rằng bạn cần phải kiểm tra xem bạn đang thực sự yêu cầu sự cho phép. Trong Android, các quyền là động bắt đầu từ phiên bản 6.0. Hoặc bạn phải yêu cầu nó trong thời gian chạy hoặc chỉ hạ cấp phiên bản targetSdk của bạn xuống 22.

Các vấn đề liên quan