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