usar studio sirve que para manejo libreria imagenes glide dev con como cargar android picasso

android - studio - ¿Guardando imagen de url usando Picasso?



para que sirve la libreria picasso en android studio (4)

Estoy intentando guardar una imagen usando API Picasso. Para hacerlo estoy intentando usar Target para guardar, pero no puedo hacer este trabajo.

Cómo podría hacer esto ?

Molesto

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

Excepción

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


Modifiqué la solución a esto, agregando permisos y un botón para cargar y guardar la Imagen, ¡y la clase PhotoLoader sigue siendo la misma!

private static final String[] STORAGE_PERMISSIONS = { Manifest.permission.WRITE_EXTERNAL_STORAGE}; ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.imageView); verifyPermissions(); } public void save(View view) { Picasso.with(this) .load("https://www.w3schools.com/howto/img_fjords.jpg") .into(new PhotoLoader("myImg.jpg" , imageView)); } public void verifyPermissions() { // This will return the current Status int permissionExternalMemory = ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE); if(permissionExternalMemory != PackageManager.PERMISSION_GRANTED) { // If permission not granted then ask for permission real time. ActivityCompat.requestPermissions(MainActivity.this,STORAGE_PERMISSIONS,1); } }


Creo que necesitas verificar si realmente estás solicitando el permiso. En Android los permisos son dinámicos a partir de la versión 6.0. Debe solicitarlo en tiempo de ejecución o simplemente rebajar su versión de targetSdk a 22.


Puedo ver 2 posibles problemas:

  1. intentando guardar en almacenamiento externo sin permisos de escritura en su manifiesto
  2. intente cambiar el nombre del archivo, por lo que no es la URL completa, lo que podría ser su problema debido a los caracteres en su URL que no son válidos como caracteres de nombre de archivo.

Resuelto ahora funciona bien!

yo si

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