[英]How to integrate Google Drive with Picasso on Android?
I'm writing an app which stores images in Google Drive and I'd like to display a gallery of those ( GridView
). 我正在编写一个应用程序,将图像存储在Google云端硬盘中,我想显示这些图库(
GridView
)。 To be more performant (ie async) I'd like to integrate this with Picasso
. 为了更高效(即异步),我想将其与
Picasso
结合起来。 But the Picasso.load(String)
is just an alias to load(Uri.parse(path))
, and I don't have a Uri
because the images are loaded like this (simplified and with undisclosed utility methods): 但是
Picasso.load(String)
只是load(Uri.parse(path))
的别名load(Uri.parse(path))
,我没有Uri
因为图像是这样加载的(简化和未公开的实用程序方法):
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 maybe supporting integration of arbitrary inputs (String/Object)? 是否有任何其他类似的库可能支持任意输入(String / Object)的集成?
Of course I'd like to use the full support of caching (network (the above method), disk, memory) in Picasso. 当然我想在Picasso中使用缓存(网络(上面的方法),磁盘,内存)的完全支持。
The version of Picasso at the time didn't support what I wanted so I went to use Glide 3 . 毕加索当时的版本不支持我想要的,所以我去使用Glide 3 。 Here's what I managed to put together.
这就是我设法组建的内容。 I didn't test it yet, I pieced it together from history, because I removed this support from my app, it was an overkill;
我还没有测试它,我把它从历史中拼凑起来,因为我从我的应用程序中删除了这个支持,这是一个过度杀伤力; however it was working when the functionality was still present.
但是当功能仍然存在时,它正在工作。
in ConnectionCallbacks.onConnected
: 在
ConnectionCallbacks.onConnected
:
Glide.get(getContext()).register(DriveId.class, InputStream.class, new DriveIdModelLoader.Factory(mClient));
in ConnectionCallbacks.onConnectionSuspended
: 在
ConnectionCallbacks.onConnectionSuspended
:
Glide.get(getContext()).unregister(DriveId.class, InputStream.class);
in list Adapter
: 在列表
Adapter
:
String driveString = cursor.getString(cursor.getColumnIndex("image"));
DriveId driveId = DriveId.decodeFromString(driveString);
Glide.with(this)
.from(DriveId.class)
.load(driveId)
.into(imageView);
Glide glue: 滑胶:
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();
}
}
}
Drive related Glide logic: 驱动相关的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;
}
}
You can download an image from Google Drive in this way: 您可以通过以下方式从Google云端硬盘下载图片:
//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 就这些
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.