¿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)?
- Uso del objetivo en Picasso en el adaptador
- Establecer recurso de fondo con Picasso
- Fotos de la escala de Android picasso para ser más grande o ajustar el imageView (sin espacio en blanco)
- Cargando varias imágenes con Picasso en el fondo
- Fade in animation while loading image Uso de Picasso
Por supuesto, me gustaría utilizar el soporte completo de almacenamiento en caché (red (el método anterior), disco, memoria) en Picasso.
- La biblioteca de Picasso no carga imágenes de la tarjeta SD en Android
- Pinzado de certificado SSL con Picasso
- Actualizar / cambiar el mapa de bits en caché utilizando Picasso y OkHttp
- Cómo implementar mi propia caché de disco con la biblioteca picasso - Android?
- Picasso no cargará Google Static Map
- Con RecyclerView, ¿Picasso sigue siendo necesario?
- Picasso Singleton Uso
- Picasso no puede cargar imagen dentro del método onSuccess de StorageReference
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
- Android Cómo simular la comunicación HTTP para la demostración fuera de línea
- ¿Qué evento se utiliza para deslizar el dedo hacia la izquierda y la derecha en el androide?