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:
- GitHub
- Android Studio 2.2: Downloading Images
- Picasso Android Tutorial – Android Picasso Image Loader Library
- Android download and save image through Picasso
- Picasso — Callbacks, RemoteViews and Notifications
- Gestión de imágenes en Android con Picasso

No hay comentarios:
Publicar un comentario