使用当前活动的 Google Drive 集成

2024-04-18

是否可以在不创建自己的 Activity 的情况下与 Google Drive 集成,而只是使用应用程序的当前 Activity,而不用 Google Drive 相关代码污染它?

我有一个后台“服务”(不是 Android 服务 - 只是一个与 UI 无关的类),负责从 Google Drive 加载一些数据。作为一项服务,它并没有真正的业务活动。但是,那Drive 集成示例 https://github.com/googledrive/android-demos/blob/master/app/src/main/java/com/google/android/gms/drive/sample/demo/BaseDemoActivity.java具有覆盖onActivityResult处理需要身份验证的情况。如果我的服务没有作为一项活动实施,我不确定如何获取这些信息。

假设我可以获得当前的参考Activity从我的“服务”中,有什么方法可以以完全独立的方式实现 Google Drive 集成吗?


我已经从具有 Activity 和 SyncService 的应用程序中完成了类似的操作。其实你可以看到很多功能演示在这里 https://github.com/seanpjanson/GDAADemo. 该演示不使用服务,但想法保持不变。

1/ 创建一个单例类(GDAA https://github.com/seanpjanson/GDAADemo/blob/master/app/src/main/java/com/spjanson/gdaademo/GDAA.java在这种情况下)与init()接受您的活动上下文的方法。这init()将实例化一个本地静态GoogleApiClient只要您不需要切换帐户(稍后解释),它就会保持活动状态。
init()在开始时或需要切换到另一个用户帐户(不同用户使用不同的 GooDrive)时使用活动上下文进行调用。活动在其上下文和供应中传递onConnFail(), onConnOK()回调。
为了完整起见,还应该有一项规定onConnectionSuspended()如果连接中断(不是 WIFI/CELL 连接断开,而是 GooPlaySvcs 暂停)。

  • The onConnFail()回调将控制权传递给 GooPlaySvcs 进行身份验证/授权,其结果返回onActivityResult()。再次连接,清洗,冲洗,重复......
  • The onConnOK()回调告诉你的活动一切都准备好了。

正如我所指出的,您必须致电init()如果您处理多个 GooDrive 帐户以创建新帐户,请再次GoogleApiClient一个新帐户。只需遵循“REQ_ACCPICK”路径即可here https://github.com/seanpjanson/GDAADemo/blob/master/app/src/main/java/com/spjanson/gdaademo/MainActivity.java。您还必须管理您的帐户,正如您在帐户管理器“AM”类别中看到的那样here https://github.com/seanpjanson/GDAADemo/blob/master/app/src/main/java/com/spjanson/gdaademo/UT.java。这种舞蹈大部分可以在主要活动 https://github.com/seanpjanson/GDAADemo/blob/master/app/src/main/java/com/spjanson/gdaademo/MainActivity.java.
为了完整起见,我还应该提到,您可以通过省略将帐户管理留给 GooPlaySvcssetAccountName(email) in the GoogleApiClient.Builder()并使用clearDefaultAccountAndReconnect()重置帐户选择。但您的应用程序不会知道当前用户是谁。另一种帐户管理可以通过 PlusApi 来处理(或者无论它叫什么,从来没有使用过它)。但我离题了。

2/ 当初始化完成并且私有静态GoogleApiClient mGAC为非空且已连接,可以从应用程序中的任何位置引用 GDAA 静态方法,包括一项服务。如果这些方法肯定会失败谷歌API客户端不存在或未连接。

在这里提到的演示中,所有 GDAA 调用都是“await()”(同步)风格。如果从非 UI 线程(如服务)调用它们,这不是问题。它们可以轻松地转换为异步版本,如下例所示:

DriveFile df = ...;
// sync version
DriveContentsResult rslt = df.open(mGAC, DriveFile.MODE_READ_ONLY, null).await();
if ((rslt != null) && rslt.getStatus().isSuccess()) {
  DriveContents cont = rslt.getDriveContents();
  InputStream is = cont.getInputStream();
  cont.discard(mGAC);    // or cont.commit();  they are equiv if READONLY
}
// async version
df.open(mGAC, DriveFile.MODE_READ_ONLY, null).setResultCallback(
  new ResultCallback<DriveContentsResult>() {
  @Override
  public void onResult(DriveContentsResult rslt) {
    if ((rslt != null) && rslt.getStatus().isSuccess()) {
      DriveContents cont = rslt.getDriveContents();
      InputStream is = cont.getInputStream();
      cont.discard(mGAC);    // or cont.commit();  they are equiv if READONLY
    }
  }
});

风格取决于您应用程序的需求(具有消耗返回值的意大利面条代码与异步处理)。

应该提到的是,这个演示使用GDAA https://developers.google.com/drive/android/introAPI 的版本。有一个REST Api https://developers.google.com/drive/v2/web/about-sdk也可以用同样的方式处理(仅同步风味)。提供了使用完全相同的逻辑和方法的替代演示here https://github.com/seanpjanson/RESTDemo。您甚至可以将两者合并为一个单例类
com.google.api.services.drive.Drive and com.google.android.gms.common.api.GoogleApiClient展示。

不过,混合使用 GDAA 和 REST Api 是危险的,因为您肯定会遇到由于 GDAA 按照自己的时间表同步而导致的计时问题,而 REST 则在您的控制之下。

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

使用当前活动的 Google Drive 集成 的相关文章

随机推荐

  • 将 Spring Boot 2.0 与 Tomcat 7.0.82 结合使用

    我有一个使用 Spring Boot 2 0 0 RC2 的项目 我需要使用 Tomcat 7 0 82 的传统部署将其部署到客户环境 我已经成功构建了一场可以通过配置成功部署的战争web xml以 Spring 应用程序的典型方式 使用
  • 如何从 firebug 控制台隐藏 ajax 请求?

    如何隐藏来自 firebug 控制台或任何显示 ajax 调用的 ajax 请求 请在ajax成功或失败后调用此函数 result load testtemplateboth testpagetpl clearconsole functio
  • 在指定时间后自动删除 mongodb 中的文档

    我想自动删除文档collection在 mongodb 中基于ttl 我查看了其他答案并找到了以下方法 db collection createIndex createdAt 1 expireAfterSeconds 3600 这将删除之后
  • PySpark:反序列化 eventhub 捕获 avro 文件中包含的 Avro 序列化消息

    初始情况 AVRO 序列化事件被发送到 azure 事件中心 这些事件使用 azure 事件中心捕获功能持久存储 捕获的数据以及事件中心元数据以 Apache Avro 格式写入 应使用 py Spark 分析捕获 avro 文件中包含的原
  • Google Translator API 和一个单词的多种翻译

    我正在使用 google api translate java 0 92 jar Translate setHttpReferrer http translate google com http translate google com t
  • LWJGL 窗口具有透明背景?

    我想创建一个没有 黑色背景 区域的窗口 但您可以看到任何其他打开的窗口等 也就是说 渲染场景并且仅渲染场景 不留框架 不留背景区域 我读过一种方法 该方法涉及渲染到隐藏的 OpenGL 窗口并将其缓冲在内存中 创建透明分层窗口以及从内存复制
  • 如何强制 Idea 和 Maven 下载我的项目的所有源代码?

    我的 Java 项目是使用 Maven 构建的 并在 Intellij Idea 的帮助下编写的 我有很多开源项目依赖项 我想广泛研究它们以了解它们是如何工作的 为此 我经常在 Idea 中使用用法搜索 即 查找用法 选项 它告诉我在哪里可
  • 使用 Groovy 在 Java 属性中进行变量扩展

    我经常使用标准 Java 属性文件来配置我的 Groovy 应用程序 我一直缺少的一项功能是能够使用变量作为属性值的一部分 以便它们可以在使用过程中动态扩展 我想我可以使用以下设计提供此功能 使用特殊的格式来注释应该扩展的属性 我选择将此类
  • Zookeeper 错过了连续更改的事件

    我目前有一个带有单个 Zookeeper 节点和 Curator 的设置来访问数据 读取数据是通过 Curator TreeCache 完成的 我有以下测试 public void test callback successive chan
  • GNU 链接器:适应名称修改算法的更改

    我正在尝试重新编译现有的 C 应用程序 不幸的是 我必须依赖一个专有库 我只有一个预编译的静态存档 我使用 g 版本 7 3 0 和 ld 版本 2 30 无论它是用什么 GCC 版本编译的 它都是古老的 头文件定义了方法 class fo
  • 如何将嵌入式 PostgreSQL Server Java 组件作为单独的服务使用?

    我正在尝试为基于 RESTful 服务 Java 的应用程序创建一个全面的集成测试套件 该应用程序在 Tomcat 7 x 中运行并依赖于 Postgresql 9 x 实例 此外 我希望能够将这个套件作为一个独立的进程运行 如果可能的话
  • 如何为 UILabel 指定日语编码?

    当我尝试在 iOS 上的 UILabel 中显示日语字符串时 它会使用中文编码而不是日语显示 这两个编码是nearly除少数特殊情况外 完全相同 例如 以下是字符 直 Unicode U 76F4 在中文 上 与日文 下 中的呈现方式 se
  • 在 Python 中设置系统日期(在 Windows 上)

    似乎有许多软件包用于获取 格式化当前日期 或查找从现在开始的 n 个时间间隔的日期 但我一定忽略了在 Python 中设置日期的简单方法 如 Windows 的 date exe 的存在 这样的功能肯定存在吗 我无法在 Google Pyt
  • 将字符串传递给 settimeout 是不好的做法吗?如果是,为什么? [复制]

    这个问题在这里已经有答案了 可能的重复 是否有充分的理由将字符串传递给 setTimeout https stackoverflow com questions 6081560 is there ever a good reason to
  • 无法获取动态导入的模块:

    我有一些延迟导入的 React 组件App tsx App tsx用于Index tsx它被渲染并附加到的地方body const IndexPage lazy gt import features IndexPage const Tags
  • 在 Playstore 中发布现成的 Kivy 应用程序之前的流程?

    我已经做了buildozer android debug并拥有 apk文件已安装并且工作正常 至少针对一个 两个设备进行了测试 这也是半默认的buildozer spec 例如 域名仍然是org test但随着应用程序的名称进行了调整 有了
  • 如何在可拖动和可放置之间划清界限?

    我正在使用优秀的 JQuery UI 进行 映射 以便用户可以 映射 来自一个计划的人员与来自另一计划的人员 使用这个简单的 JQuery document ready function div draggable draggable re
  • 如何在 iOS 上检测设备的方向?

    我有一个关于如何在 iOS 上检测设备方向的问题 我不需要接收更改通知 只需接收当前方向本身 这似乎是一个相当简单的问题 但我一直无法理解它 以下是我到目前为止所做的 UIDevice myDevice UIDevice currentDe
  • 插件 AppDomains 解决方法

    在处理自己的子目录中的插件程序集时 存在一个众所周知的问题 一旦这些程序集尝试从其子目录加载各自的依赖项 它们将无法加载 解决方案是在 AppDomains 中加载插件PrivateBinPath设置在他们的AppDomainSetup初始
  • 使用当前活动的 Google Drive 集成

    是否可以在不创建自己的 Activity 的情况下与 Google Drive 集成 而只是使用应用程序的当前 Activity 而不用 Google Drive 相关代码污染它 我有一个后台 服务 不是 Android 服务 只是一个与