是否可以在不创建自己的活动的情况下与Google云端硬盘集成,而只是使用应用程序的当前活动而不会使用与Google云端硬盘相关的代码进行污染?
我有一个后台“服务”(不是Android服务 - 只是一个与UI无关的类),负责从Google云端硬盘加载一些数据。作为一项服务,它没有真正的业务是一项活动。但是,samples for Drive integration覆盖onActivityResult
以处理需要身份验证的情况。如果我的服务没有作为活动实现,我不确定如何掌握这些信息。
假设我可以从我的“服务”获得对当前Activity
的引用,我是否可以通过某种方式以完全独立的方式实施Google Drive集成?
答案 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.Drive
和com.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/