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

时间:2015-12-15 06:52:22

标签: java android google-drive-android-api

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

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

假设我可以从我的“服务”获得对当前Activity的引用,我是否可以通过某种方式以完全独立的方式实施Google Drive集成?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

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

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

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

正如我所指出的,如果您处理多个GooDrive帐户以便为新帐户创建新的init(),则必须再次致电GoogleApiClient。只需按照' REQ_ACCPICK'追踪here。您还必须管理自己的帐户,因为您可以在帐户管理器中看到“AM'班here。大多数这种舞蹈都可以在MainActivity中看到 为了完整起见,我还要提一下,您可以通过省略setAccountName(email)中的GoogleApiClient.Builder()并使用clearDefaultAccountAndReconnect()重置帐户选择来将帐户管理留给GooPlaySvcs。但是你的应用程序不知道当前用户是谁。另一个帐户管理可以通过PlusApi(或任何它被称为,从未使用它)来处理。但我离题了。

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

在这里提到的演示中,所有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
    }
  }
});

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

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

混合使用GDAA和REST Api是危险的,因为GDAA会根据自己的日程安排同步,因此您肯定会遇到时间问题,而REST则在您的控制之下。 / p>

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

答案 2 :(得分:2)

我认为你可以使用google drive REST api调用https://developers.google.com/drive/v2/reference/来实现你想要的效果

以下是您的行动方式。 由于你获得了上下文,你可以执行api调用来驱动。对于身份验证,因为google遵循OAuth 2.0,您可以使用这些api调用来实现身份验证https://developers.google.com/identity/