我已经从具有 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 则在您的控制之下。