me-*_*e-- 13 java android google-drive-android-api
是否可以在不创建自己的活动的情况下与Google云端硬盘集成,而只是使用应用程序的当前活动而不会使用与Google云端硬盘相关的代码进行污染?
我有一个后台"服务"(不是Android服务 - 只是一个与UI无关的类),负责从Google云端硬盘加载一些数据.作为一项服务,它没有真正的业务是一项活动.但是,Drive集成的示例具有覆盖onActivityResult以处理需要身份验证的情况.如果我的服务没有作为一项活动实施,我不确定如何掌握这些信息.
假设我可以Activity从我的"服务"中获得对当前电流的参考,我是否可以通过某种方式以完全独立的方式实施Google Drive集成?
小智 6
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<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
}
}
});
Run Code Online (Sandbox Code Playgroud)
风味取决于您的应用程序的需求(带有消耗的返回值与异步处理的意大利面条代码).
应该提到的是,这个演示使用了Api 的GDAA版本.还有一个REST Api可以以相同的方式处理(仅限同步风格).此处提供了使用完全相同的逻辑和方法的替代演示.您甚至可以将两者合并为一个单独的类,同时具有两者
com.google.api.services.drive.Drive和com.google.android.gms.common.api.GoogleApiClient
现在.
混合GDAA和REST Api是危险的,因为你肯定会遇到因GDAA按照自己的时间表同步而导致的时序问题,而REST在你的控制之下.
希望它有所帮助,祝你好运
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |