如何在 Android 上将 Google Drive 与 Picasso 集成?

2024-03-01

我正在编写一个在 Google Drive 中存储图像的应用程序,我想显示这些图像的图库(GridView)。为了提高性能(即异步),我想将其与Picasso。但是Picasso.load(String)只是一个别名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));
    }
}

是否有其他类似的库可能支持任意输入(字符串/对象)的集成?

当然我想使用Picasso中对缓存(网络(上述方法)、磁盘、内存)的全面支持。


当时Picasso的版本不支持我想要的所以我就去使用Glide 3 https://github.com/bumptech/glide。这是我设法整理的内容。我还没有测试它,我把它从历史中拼凑起来,因为我从我的应用程序中删除了这个支持,这是一个矫枉过正;然而,当功能仍然存在时它就可以工作。

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 list Adapter:

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

滑行胶:

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逻辑:

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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Android 上将 Google Drive 与 Picasso 集成? 的相关文章

  • RecyclerView每隔几个项目都是相同的 - 可扩展项目

    我的 recyclerView 有问题 我正在使用此布局来扩展 recyclerView 中的 cardView https github com AAkira ExpandableLayout https github com AAkir
  • 在解决依赖关系之前运行 gradle 任务

    我想运行一个 gradle 任务 在 gradle 尝试解决依赖关系之前获取其他源并设置它们 在 build gradle 中有一个任务 用于获取子项目的源代码 该任务需要在 Gradle 尝试解决依赖关系之前运行 因为子项目是依赖关系的一
  • Android-ListView-performItemClick

    当我尝试使用时遇到一些困难执行项目单击ListView 的功能 我想要做的就是以编程方式在列表的第一项中执行单击 我怎样才能做到这一点 我在文档中查找了该函数 但我并不真正理解它的参数 我尝试过类似的事情 myListView perfor
  • Android 中的列表视图到 pdf

    我有一个自定义列表视图 我想从整个列表视图制作pdf 我参考了很多帖子并实现了下面的代码 该代码将我的列表视图转pdf 但问题是它不包含整个列表视图项目 pdf 中仅提供前几项 我的转换函数列表视图转pdf is fab setOnClic
  • Android 应用程序主活动出现 ClassNotFoundException

    大多数设备都可以运行我的应用程序 但我收到此错误报告 java lang RuntimeException Unable to instantiate activity ComponentInfo com company app com c
  • Android:让用户从图库中选择图像或视频

    是否可以以这样的方式启动图库 以便同时显示图片和视频 Thanks 从图库中选择音频文件 Use MediaStore Audio Media EXTERNAL CONTENT URI Intent intent new Intent In
  • Android物理引擎[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在研究了 3D 游戏编程之后 很快就明白了为什么物理引擎非常有用 Android 支持哪些物理引擎并且可以在 Android 上使用 关于
  • Firebase 云消息传递 - 如何验证令牌?

    我正在使用 Firebase Cloud Messaging FCM 并且每次在客户设备上生成新令牌时 都会根据下面的缩写代码 我将此新令牌发送到我的服务器数据库 云 并将其保存在其中 以便能够发送未来推送通知使用 CFM API 从服务器
  • 不同风格的模块文件

    我正在尝试在同一个应用程序中实现播放服务和华为服务 但希望能够按风格配置使用哪一个 每种风格都使用自己的 applicationIdSuffix 因此 对于每种不同的风格 华为插件都会失败 我无法编译 我的应用程序模块包含agconnect
  • 在应用程序之间共享自定义帐户验证器

    我有一个为使用自定义 AccountAuthenticator 的客户端构建的应用程序 它工作得非常好 并且满足了客户的需求 但是 这只是将使用相同身份验证管理器的应用程序集合中的第一个应用程序 这就是我不确定如何继续的地方 我无法知道任何
  • 如何将您的终端与 Android 模拟器连接

    我尝试导航到 android 工具文件夹并输入 adb shell 命令 但它似乎不起作用 我的终端似乎只能识别命令的 adb 部分 并给我一条错误消息 我究竟做错了什么 通过键入列出所有连接的设备adb devices 检查是否列出了任何
  • toArray 与预先确定大小的数组

    使用时ar toArray new String ar size 安卓工作室3 2 1警告预先确定大小的数组并建议空数组 有两种方式将集合转换为数组 使用 预先确定大小的数组 如 c toArray new String c size 或使
  • Eclipse Android 模拟器 - 键盘不工作

    我刚刚更新到最新的 SDK 版本 16 使用最新版本的 API 16 创建了新版本的 AVD 并且我的硬件键盘在模拟器上不再工作 甚至我的其他 avd 使用旧版本的 sdk 任何想法如何解决这一问题 您的 AVD 的 键盘支持 硬件属性是否
  • Android Studio错误的含义:未注释的参数覆盖@NonNull参数

    我正在尝试 Android Studio 创建新项目并添加默认值后onSaveInstanceState方法创建 MyActivity 类 当我尝试将代码提交到 Git 时 我收到一个我不明白的奇怪错误 代码是这样的 我得到的错误是这样的
  • 调用属于Fragment的Activity的函数

    我正在与多个Fragments在 Android 下 我对如何从嵌入式应用程序发送和接收数据感到困惑 为了简单的解释 我有一个ListFragment and a MapFragment使用解释的方法here https stackover
  • 测试应用内结算:“发布者无法购买此商品”

    我的应用程序似乎已准备好在我的设备上进行应用内购买程序的 现实生活 测试 但是 我在 Play 商店中收到 发布商无法购买此商品 的错误消息 现在 我应该如何测试这个 我不想通过仅用于测试的虚拟帐户重新安装手机来丢失手机的配置 在开发者控制
  • Android RxJava 2 JUnit 测试 - android.os.Looper 中的 getMainLooper 未模拟 RuntimeException

    我在尝试为正在使用的演示者运行 JUnit 测试时遇到 RuntimeExceptionobserveOn AndroidSchedulers mainThread 由于它们是纯 JUnit 测试而不是 Android 仪器测试 因此它们无
  • 尝试重新打开已关闭的对象:sqlitequery

    所以本质上我查询数据库两次 我不明白这个错误真正来自哪里 因为我没有在任何地方关闭数据库 返回错误的代码是这样运行的 我查了一下 刚刚看到一个像我这样的案例 BeaconHandler pullAllDB new BeaconHandler
  • 如何以相同的意图从相机获取全尺寸图片和缩略图

    我一直需要找到这个问题的解决方案 我已经从这个社区搜索并测试了许多解决方案 但任何人都适合帮助我 我有两个活动 第一个活动拍摄一张照片并将其发送到另一个活动 该活动有一个 ImageView 来接收该照片 直到这里我遇到问题 以及一个在数据
  • 如何在 Android 的应用程序中使用 LDAP 身份验证?

    我想在我们的应用程序中添加 LDAP 身份验证 我在 Github 上搜索并找到了两个应用程序 但它们无法连接到服务器 通过ldap连接服务器的必要条件是什么 查看 UnboundID SDK 他们有一个适用于 Android 的套件 该应

随机推荐

  • 在 C# 源代码中打破长字符串的最佳方法

    我想知道在 C 源代码中打破长字符串的 最佳实践 是什么 是这个字符串吗 string1 string2 string3 在编译期间或运行时连接 它是在编译时完成的 这与 string1string2string3 完全相同 假设您有 st
  • Django 相当于每个用户的最新条目

    我很惊讶这个问题没有被提出 在网上找不到太多 Using Entry objects latest created at 我可以恢复所有 Entry 对象的最新条目 但是如果我想要每个用户的最新条目 这类似于 SQL 最新记录查询 但是我如
  • 执行内联powershell脚本

    我正在尝试从任务计划程序调用内联 powershell 脚本 以便在触发特定事件时发送电子邮件 我无法在任务计划程序操作窗口中使用本机 发送电子邮件 操作 因为 SMTP 服务器需要 SSL 并且无法在操作窗口中指定此操作 因此 我希望 启
  • 同步集合线程安全

    我有 System Collections Generic SynchronizedCollection 共享集合 我们的代码使用 Net 4 0任务库来跨越线程并将同步集合传递给线程 到目前为止 线程尚未向集合中添加或删除项目 但是新的要
  • Java 中什么时候方法调用可以更改参数,什么时候不可以更改参数? [复制]

    这个问题在这里已经有答案了 这是在java中 我尝试在这里寻找 谷歌搜索这个问题的答案 但找不到足够的答案 所以如果这是重复的 我深表歉意 我对更改您输入的参数的方法背后的规则感到困惑 例如 考虑以下示例 public static voi
  • logback每小时回滚时删除MaxHistory之前的日志

    我使用下面的附加程序 我可以看到回滚每小时发生一次 但我提到了
  • 如何测试包含 gets.chomp 的函数?

    我有一个使用 gets chomp 的简单函数 如下所示 def welcome user puts Welcome What would you like to do action gets chomp end 我想用它来测试它ruby是
  • RAND_MAX 宏:有符号还是无符号?

    我查阅了 C 标准 从 1999 年开始 它只说RAND MAX应该至少为 32767 但没有说明该宏是否应扩展为有符号整数或无符号整数 单一 UNIX 规范 link 1 http pubs opengroup org onlinepub
  • fileprivate 和 private 扩展名之间的区别?

    斯威夫特3 0 我知道fileprivate访问级别修饰符限制对声明它的源文件的函数 属性的使用 并且private 仅限于声明的词法范围 但似乎这条规则不适用于延期 例如 此代码有效 class Foo fileprivate exten
  • 如何从 GoDaddy 导入证书进行 Java 代码签名? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要能够使用 CA 的证书对 jar 文件进行签名 我按照 GoDaddy 文档中有关如何执行此操作
  • oop 中具有状态和行为的对象

    我不断听到术语 对象具有行为和状态 或只是其中之一 但有什么区别或者它意味着什么 如果有人能举一个例子 我将非常感激 灯是一个物体 lamp 中的 状态 开和关 lamp 中的 行为 打开和关闭 在编程中 您在 字段 中声明状态 在 方法
  • 加载 gif 图像在 IE 和 Chrome 中不显示

    我正在使用 JQuery ajax 调用向服务器发送同步调用 并希望显示当时的加载图像 但是加载图像在 Firefox 中可见 但在 IE 和 chrome 中不可见 当我调试时 我发现在 IE 中 当我们调用 java 脚本时 它会停止在
  • MATLAB sgolay(k, f) 的 Python 等效项是什么?

    我在 MATLAB 中有一个函数 b g sgolay k f 它输出一个 f x f 矩阵 当我在 Python 中对相同的 k 和 f 值运行相同的操作时 使用 scipy signal savgol coeffs f k 它输出一个完
  • 在 Bitbucket 中创建拉取请求:错误“不相关的分支”

    我有一个小团队在单个存储库上工作 我要求每个队友创建自己的分支并在该分支上工作 他们所有人都克隆了存储库 然后执行了以下命令 git checkout b BitPankaj BitPankaj是插图分支名称 他们开始在这个分支上工作并通过
  • 我可以使用 LLVM(低级虚拟机)为哪些平台编译二进制文件?

    我对使用 LLVM 的 Clang 编译器感兴趣 LLVM 声称是跨平台的 但尚不清楚可以针对哪些平台 我对此做了很多谷歌搜索 但似乎没有太多关于 LLVM 支持的平台的信息 我唯一发现的是 this http llvm org docs
  • 使用用户的 UID 发送 Firebase 云消息

    我想构建一个 Android 应用程序 允许用户向其他用户发送通知和数据消息 我最近才开始使用 Firebase Firebase 云消息传递对我来说仍然很困惑 我已经实现了向特定的发送消息device使用 Firebase 实例 ID 但
  • 未定义的引用 Json::Value 和 Json::Reader [重复]

    这个问题在这里已经有答案了 当我运行以下代码时 include
  • 从 CSV 文件读取/写入嵌套字典列表 (Python)

    我有一个如下所示的数据结构 data key 1 calc1 42 calc2 3 142 key 2 calc1 123 4 calc2 1 414 key 3 calc1 2 718 calc2 0 577 我希望能够将数据保存 加载到
  • Jenkins 建立健康阈值

    有没有办法改变 Jenkins 根据失败的测试计算构建运行状况的方式 我希望詹金斯治疗any失败的测试不是 阳光明媚 的 但到目前为止 我寻找一种方法来做到这一点还没有结果 标准设置是否允许这种级别的控制 或者是否有插件可以做到这一点 如果
  • 如何在 Android 上将 Google Drive 与 Picasso 集成?

    我正在编写一个在 Google Drive 中存储图像的应用程序 我想显示这些图像的图库 GridView 为了提高性能 即异步 我想将其与Picasso 但是Picasso load String 只是一个别名load Uri parse