当前位置:  开发笔记 > 编程语言 > 正文

Google Drive使用当前活动进行整合

如何解决《GoogleDrive使用当前活动进行整合》经验,为你挑选了2个好方法。

是否可以在不创建自己的活动的情况下与Google云端硬盘集成,而只是使用应用程序的当前活动而不会使用与Google云端硬盘相关的代码进行污染?

我有一个后台"服务"(不是Android服务 - 只是一个与UI无关的类),负责从Google云端硬盘加载一些数据.作为一项服务,它没有真正的业务是一项活动.但是,Drive集成的示例具有覆盖onActivityResult以处理需要身份验证的情况.如果我的服务没有作为一项活动实施,我不确定如何掌握这些信息.

假设我可以Activity从我的"服务"中获得对当前电流的参考,我是否可以通过某种方式以完全独立的方式实施Google Drive集成?



1> 小智..:

onActivityResult代码路径仅在需要用户干预的身份验证失败时使用.因此,根据定义,它不能简单地由您的服务"在后台"处理.

在后台服务的情况下,我认为处理身份验证失败的一种适当方法是显示一条通知,说明"您需要进行身份验证才能继续".您可以将Intent附加到通知,以便在用户点击通知时启动您自己的"ResolveAuthActivity".此ResolveAuthActivity只是尝试连接到API,处理onConnectionFailed中的失败,然后启动分辨率Intent.解决问题后,您的ResolveAuthActivity可以激活您的服务以尝试再次连接到API.



2> seanpj..:

我已经从具有Activity和SyncService的应用程序中做了类似的事情.实际上,您可以在此处看到演示中的许多功能.这个演示不使用服务,但这个想法保持不变.

1/使用接受活动上下文的init()方法创建单例类(在本例中为GDAA).只要您不需要切换帐户,这将实例化一个保持活动的本地静态(稍后解释).在开始时或当需要切换到另一个用户帐户(不同用户的不同GooDrive)时调用活动上下文.活动在其上下文中传递并提供回调. 为了完整起见,还应该有一个规定,以防连接中断(不是WIFI/CELL连接丢弃,而是GooPlaySvcs暂停). init()GoogleApiClient
init()onConnFail(), onConnOK()
onConnectionSuspended()

onConnFail()回调将控制权交给GooPlaySvcs认证/授权,其结果来回来onActivityResult().再次连接,清洗,冲洗,重复......

onConnOK()回调告诉你的活动是万事俱备.

正如我所指出的,init()如果您处理多个GooDrive帐户以便GoogleApiClient为新帐户创建新帐户,则必须再次呼叫.只需点击此处的"REQ_ACCPICK"路线即可.您还必须在帐户管理员"AM"课程中查看您的帐户.大多数这种舞蹈都可以在MainActivity中看到.
为了完整起见,我还要提到的是,你可以通过省略离开帐户管理GooPlaySvcs setAccountName(email)GoogleApiClient.Builder(),并使用clearDefaultAccountAndReconnect()重置帐户采摘.但是你的应用程序不知道当前用户是谁.另一个帐户管理可以通过PlusApi(或任何它被称为,从未使用它)来处理.但我离题了.

2 /初始化完成且私有静态GoogleApiClient mGAC非空并且已连接时,可以从应用程序的任何位置引用GDAA静态方法,包括服务.如果GoogleApiClient处于活动状态或未连接,则这些方法肯定会失败.

在这里提到的演示中,所有GDAA调用都具有'await()'(sync)风格.如果从非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() {
  @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
    }
  }
});

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

应该提到的是,这个演示使用了Api 的GDAA版本.还有一个REST Api可以以相同的方式处理(仅限同步风格).此处提供了使用完全相同的逻辑和方法的替代演示.您甚至可以将两者合并为一个单独的类,同时具有两者
com.google.api.services.drive.Drivecom.google.android.gms.common.api.GoogleApiClient 现在.

混合GDAA和REST Api是危险的,因为你肯定会遇到因GDAA按照自己的时间表同步而导致的时序问题,而REST在你的控制之下.

希望它有所帮助,祝你好运

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有