¿Cómo integrar Google Drive con Picasso en Android?

Estoy escribiendo una aplicación que almacena imágenes en Google Drive y me gustaría mostrar una galería de esas ( GridView ). Para ser más performant (es decir, asíncrono) Me gustaría integrar esto con Picasso . Pero el Picasso.load(String) es sólo un alias para load(Uri.parse(path)) , y no tengo un Uri porque las imágenes se cargan de esta manera (simplificado y con métodos de utilidad no revelados):

 public static Bitmap getBitmap(DriveId id) { GoogleApiClient client = ApiClientAsyncTask.createConnectedClient(App.getAppContext()); DriveFile file = Drive.DriveApi.getFile(client, id); Metadata meta = sync(file.getMetadata(client)); Contents contents = sync(file.openContents(client, DriveFile.MODE_READ_ONLY, null)); InputStream imageStream = contents.getInputStream(); try { return BitmapFactory.decodeStream(imageStream); } finally { IOTools.ignorantClose(imageStream); sync(file.discardContents(client, contents)); } } 

¿Existe alguna otra biblioteca similar que apoye la integración de entradas arbitrarias (String / Object)?

Por supuesto, me gustaría utilizar el soporte completo de almacenamiento en caché (red (el método anterior), disco, memoria) en Picasso.

La versión de Picasso en ese momento no apoyaba lo que quería así que fui a usar Glide 3 . Esto es lo que logré armar. No lo probé todavía, lo reconstruí de la historia, porque eliminé este apoyo de mi aplicación, fue una exageración; Sin embargo, estaba funcionando cuando la funcionalidad todavía estaba presente.

En ConnectionCallbacks.onConnected :

 Glide.get(getContext()).register(DriveId.class, InputStream.class, new DriveIdModelLoader.Factory(mClient)); 

En ConnectionCallbacks.onConnectionSuspended :

 Glide.get(getContext()).unregister(DriveId.class, InputStream.class); 

En la lista Adapter :

 String driveString = cursor.getString(cursor.getColumnIndex("image")); DriveId driveId = DriveId.decodeFromString(driveString); Glide.with(this) .from(DriveId.class) .load(driveId) .into(imageView); 

Glide pegamento:

 import java.io.*; import android.content.Context; import android.net.Uri; import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.model.*; import com.bumptech.glide.load.model.stream.StreamModelLoader; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.drive.DriveId; public class DriveIdModelLoader implements StreamModelLoader<DriveId> { private final GoogleApiClient client; public DriveIdModelLoader(GoogleApiClient client) { this.client = client; } public DataFetcher<InputStream> getResourceFetcher(DriveId model, int width, int height) { return new DriveIdDataFetcher(client, model); } public static class Factory implements ModelLoaderFactory<DriveId, InputStream> { private final GoogleApiClient client; public Factory(GoogleApiClient client) { this.client = client; } public ModelLoader<DriveId, InputStream> build(Context context, GenericLoaderFactory factories) { return new DriveIdModelLoader(client); } public void teardown() { client.disconnect(); } } } 

Unidad relacionada lógica de Glide:

 import java.io.InputStream; import org.slf4j.*; import com.bumptech.glide.Priority; import com.bumptech.glide.load.data.DataFetcher; import com.google.android.gms.common.api.*; import com.google.android.gms.drive.*; public class DriveIdDataFetcher implements DataFetcher<InputStream> { private static final Logger LOG = LoggerFactory.getLogger(DriveIdDataFetcher.class); private final GoogleApiClient client; private final DriveId driveId; private boolean cancelled = false; private DriveFile file; private Contents contents; public DriveIdDataFetcher(GoogleApiClient client, DriveId driveId) { this.client = client; this.driveId = driveId; } public String getId() { return driveId.encodeToString(); } public InputStream loadData(Priority priority) { if (cancelled) return null; if (client == null) { LOG.warn("No connected client received, giving custom error image"); return null; } file = Drive.DriveApi.getFile(client, driveId); if (cancelled) return null; contents = sync(file.openContents(client, DriveFile.MODE_READ_ONLY, null)).getContents(); if (cancelled) return null; return contents.getInputStream(); } public void cancel() { cancelled = true; if (contents != null) { file.discardContents(client, contents); } } public void cleanup() { if (contents != null) { sync(file.discardContents(client, contents)); } } private static <T extends Result> void assertSuccess(T result) { if (!result.getStatus().isSuccess()) { throw new IllegalStateException(result.getStatus().toString()); } } private static <T extends Result> T sync(PendingResult<T> pending) { T result = pending.await(); assertSuccess(result); return result; } } 

Puede descargar una imagen de Google Drive de esta manera:

  //this is the original Google Drive link to the image String s="https://drive.google.com/file/d/0B9nFwumYtUw9Q05WNlhlM2lqNzQ/view?usp=sharing"; //you have to get the part of the link 0B9nFwumYtUw9Q05WNlhlM2lqNzQ String[] p=s.split("/"); //Create the new image link String imageLink="https://drive.google.com/uc?export=download&id="+p[5]; ImageView imageView = (ImageView) findViewById(R.id.imageView); Picasso.with(YourActivity.this).load(imageLink).into(imageView); 

eso es todo

  • ¿Es posible descargar imágenes de la memoria caché en picasso?
  • La forma más fácil de usar Picasso en la notificación (icono)
  • Picasso IllegalArgumentException El objetivo no debe ser nulo
  • Memoria caché de picasso para Android
  • Adición de bordes para imagen redondeada android
  • Establecer el ancho máximo para cargar imágenes con Picasso
  • ¿Cómo puedo utilizar un color como imagen de marcador de posición con Picasso?
  • Picasso y PhotoView Library cargan imagen en ImageView extraño
  • Picasso ejecutar primero no llamar onBitmapLoaded in for loop
  • Picasso carga de imagen de devolución de llamada
  • Cargas de Picasso en la imagen errónea cuando se utiliza patrón titular de la vista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.