是否可以在不创建自己的活动的情况下与Google云端硬盘集成,而只是使用应用程序的当前活动而不会使用与Google云端硬盘相关的代码进行污染?
我有一个后台"服务"(不是Android服务 - 只是一个与UI无关的类),负责从Google云端硬盘加载一些数据.作为一项服务,它没有真正的业务是一项活动.但是,Drive集成的示例具有覆盖onActivityResult
以处理需要身份验证的情况.如果我的服务没有作为一项活动实施,我不确定如何掌握这些信息.
假设我可以Activity
从我的"服务"中获得对当前电流的参考,我是否可以通过某种方式以完全独立的方式实施Google Drive集成?
onActivityResult代码路径仅在需要用户干预的身份验证失败时使用.因此,根据定义,它不能简单地由您的服务"在后台"处理.
在后台服务的情况下,我认为处理身份验证失败的一种适当方法是显示一条通知,说明"您需要进行身份验证才能继续".您可以将Intent附加到通知,以便在用户点击通知时启动您自己的"ResolveAuthActivity".此ResolveAuthActivity只是尝试连接到API,处理onConnectionFailed中的失败,然后启动分辨率Intent.解决问题后,您的ResolveAuthActivity可以激活您的服务以尝试再次连接到API.
我已经从具有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.Drive
和com.google.android.gms.common.api.GoogleApiClient
现在.
混合GDAA和REST Api是危险的,因为你肯定会遇到因GDAA按照自己的时间表同步而导致的时序问题,而REST在你的控制之下.
希望它有所帮助,祝你好运