How to integrate Google Drive with Picasso on Android?

I am writing an application that stores images in Google Drive, and I would like to display their gallery ( GridView ). To be more productive (i.e.Async), I would like to integrate it with Picasso . But Picasso.load(String) is just an alias of load(Uri.parse(path)) , and I don’t have Uri , because the images are loaded as follows (simplified and with undisclosed utility methods):

 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)); } } 

Is there any other similar library that can support integration of arbitrary inputs (String / Object)?

Of course, I would like to use the full cache support (network (the above method), disk, memory) in Picasso.

+6
source share
2 answers

The Picasso version at that time did not support what I wanted, so I went to use Glide 3 . Here is what I managed to collect. I have not tested it yet, I compiled it from history because I removed this support from my application, it was too much; however, it worked when functionality was still present.

in ConnectionCallbacks.onConnected :

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

in ConnectionCallbacks.onConnectionSuspended :

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

in the Adapter list:

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

Glue for bonding:

 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(); } } } 

Glide Drive Related Logic:

 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; } } 
+8
source

You can download an image from Google Drive this way:

  //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); 

that is all

+3
source

Source: https://habr.com/ru/post/973386/


All Articles