martes, 10 de enero de 2017

Librería Picasso para la gestión de imágenes

Picasso es una librería para android que se utiliza para gestionar las imágenes utilizando técnicas de cacheo. Esto consiste en que la librería se encarga de almacenar/recuperar las imágenes de la memoria volatil o interna del dispositivo o de descargarla de internet en caso necesario. También se encarga de eliminarla cuando ya no la utilizamos.



Para usar esta librería lo primero que necesitamos es añadir la siguiente línea a buidl.gradle

compile 'com.squareup.picasso:picasso:2.5.2'

Además hay que añadir los siguientes permisos en manifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

Para utilizarlo tan solo hay que añadir la siguiente instrucción:

Picasso.with(this).load("http://servidor.com/imagen.jpg").into(imageView);

Se pueden configurar muchas opciones como que nos muestre si ha descargado la imagen de la caché, del disco o lo ha descargado de internet con un pequeño label en una de las esquinas (esto es útil sobre todo en fase de desarrollo):

Picasso.with(this).setIndicatorsEnabled(true);

También podemos aplicar un procesado de la imagen, o que carge una imagen determinada en caso de fallo en la descarga, etc

Picasso.with(this).load("http://servidor.com/imagen.jpg").error(R.drawable.error).fit().transform(new RoundedTransformation()).into(imageView);

Una funcionalidad para mi muy interesante es que podemos controlar la descarga de la imagen. Para ello utilizamos un target como destino:

Picasso.with(this).load(hdurl).into(target)

En este ejemplo, dependiendo del valor de una variable (TipoDownload) podemos realizar varias operaciones una vez hayamos descargado la imagen:

// Guarda la imagen en una carpeta del almacenamiento externo
public void saveImageExtPath(Bitmap bipmap, String nameImage, String path) {
   FileOutputStream fileOutputStream = null;
   String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + path;
   File dir = new File(file_path);
   if (!dir.exists()) {
       dir.mkdirs();
   }
   File new_file = new File(dir, nameImage);
   try {
       fileOutputStream = new FileOutputStream(new_file);
       bipmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
       fileOutputStream.flush();
       fileOutputStream.close();
       // añade la imagen a la galería de fotos
       MediaScannerConnection.scanFile(this, new String[] { new_file.getPath() }, new String[] { "image/jpeg" }, null);
       if (TipoDownload == 2) { // Compartiendo imagen
           // Compartir la imagen guardada anteriormente

           Intent share = new Intent(Intent.ACTION_SEND);
           share.setType("image/jpeg");
           share.putExtra(Intent.EXTRA_TEXT, title);
           share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new_file));
           startActivity(Intent.createChooser(share, getResources().getString(R.string.compartir)));
           //boolean deleted = new_file.delete();
       }
       if (TipoDownload == 4) { // Guardando imagen
           // Muestra el mensaje
           Toast.makeText(getApplicationContext(), getResources().getString(R.string.mensajeImagenGuardada) + ": " + path + "/" + nameImage, Toast.LENGTH_LONG).show();
       }
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }
}


private Target target = new Target() {
   ProgressDialog pDialog;

   @Override
   public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
       // loading of the bitmap was a success
       if (TipoDownload == 2) { // Compartir
           saveImageExtPath(bitmap, txtSubTitulo.getText() + ".jpg", "/jAPOD");
       }

       if (TipoDownload == 3) { //Wallpaper
           WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext());
           try {
               wallpaperManager.setBitmap(bitmap);
               Toast.makeText(getApplicationContext(),getResources().getString(R.string.wallpaperOK),Toast.LENGTH_SHORT).show();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       if (TipoDownload == 4){ //Guarda la imagen
           saveImageExtPath(bitmap, txtSubTitulo.getText() + ".jpg", "/jAPOD");
       }

       pDialog.dismiss();
   }

   @Override
   public void onBitmapFailed(Drawable errorDrawable) {
       // loading of the bitmap failed
       if (TipoDownload == 2) Toast.makeText(getApplicationContext(),getResources().getString(R.string.errorLoad),Toast.LENGTH_SHORT).show(); //Compartir
       if (TipoDownload == 3) Toast.makeText(getApplicationContext(),getResources().getString(R.string.errorLoad),Toast.LENGTH_SHORT).show(); //Wallpaper
       if (TipoDownload == 4) Toast.makeText(getApplicationContext(),getResources().getString(R.string.errorSavePicture),Toast.LENGTH_SHORT).show(); //Guardar
       pDialog.dismiss();

       Toast.makeText(getApplicationContext(),getResources().getString(R.string.wallpaperOK),Toast.LENGTH_SHORT).show();
   }

   @Override
   public void onPrepareLoad(Drawable placeHolderDrawable) {
       pDialog = new ProgressDialog(MainActivity.this);
       if (TipoDownload == 2 )pDialog.setMessage(getResources().getString(R.string.cargandoImagen));
       if (TipoDownload == 3 )pDialog.setMessage(getResources().getString(R.string.cargandoImagen));
       if (TipoDownload == 4 )pDialog.setMessage(getResources().getString(R.string.guardandoImagen));
       pDialog.setCancelable(true);
       pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
       pDialog.show();
   }
};

La función onBitmapLoaded se ejecuta una vez se haya descargado/obtenido la imagen, onBitmapFailed se ejecuta si se ha producido un error en la descarga/obtención de la imagen mientras que onPrepareLoad se ejecuta antes de iniciar la descarga/obtención de la imagen

Fuentes:

    No hay comentarios:

    Publicar un comentario