访问Google API – GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken()

最近,我一直在Android上使用Google API,特别是Analytics,AdSense和Tasks API。

我看过一些Google提供的样本,他们使用这个语句来获得一个GoogleAccountCredential对象

https://code.google.com/p/google-api-java-client/source/browse/tasks-android-sample/src/main/java/com/google/api/services/samples/tasks/android/ TasksSample.java?repo=samples

credential = GoogleAccountCredential.usingOAuth2(this, Collections.singleton(TasksScopes.TASKS));

但是,如果我阅读文档,例如:
http://developer.android.com/google/auth/http-auth.html
http://developer.android.com/google/play-services/auth.html

他们都提到下面的方法来获取令牌:
token = GoogleAuthUtil.getToken(mActivity, mEmail, mScope);

我很困惑在哪个场景以及为什么使用哪一个。 我一直在使用方法号。 1成功,而不需要在喜好中坚持令牌(我想这是由GoogleAccountCredential自动完成的)

  1. 谁能告诉我为什么有人会使用第一种方法而不是第二种?

  2. 如何在第一个方法中访问身份validation令牌?

用于Java的Google API客户端库正如其名称所暗示的用于访问Google API的库,并且可用于多种平台(例如Java(通常)和Android),而Google Play服务和GoogleAuthUtil仅在Android上可用。

通过查看项目的wiki页面 ,很难理解Google API客户端库如何与GoogleAuthUtil相关联,因为wikibuild议使用AccountManager来处理Google帐户,并且根本没有提及GoogleAuthUtil。

但是,如果您深入了解代码及其问题跟踪器,则可以看到,在添加对GoogleAuthUtil的支持时,链接的任务示例实际上使用 GoogleAuthUtil自Google API客户端库版本1.12.0以来的版本 。

维基可能是提到AccountManager而不是GoogleAuthUtil,因为这是在GoogleAuthUtil可用之前进行OAuth2身份validation的方式,也是因为维基的这一部分尚未更新。

有关AccountManager和GoogleAuthUtil之间差异的更多信息,请参阅: 简而言之,与使用OAuth2请求getAuthToken和getToken

简而言之,Google API客户端库是用于与Google服务交互的跨平台库,Android版本是使用GoogleAuthUtil实现的。

谁能告诉我为什么有人会使用第一种方法而不是第二种?

使用Google API客户端库的原因

  • 如果您正在开发Android以外的其他平台,则无法使用GoogleAuthUtil,因为它是Android特定的库。
  • 如果您正在开发跨平台应用程序,则可以在共享代码中将Google API客户端库用于Android和其他平台。
  • 如果您与Google的许多服务有很多交互,则此库可能会让您更轻松。
  • 如果您已经在使用它,并且按照想要的方式工作,那么继续使用它并没有任何缺点,因为它是GoogleAuthUtil的包装器,因此与使用AccountManager或其他基于AccountManager的库相比,您可以获得GoogleAuthUtil的所有优点。

使用GoogleAuthUtil的原因

  • 使用此function不需要Google Play服务以外的其他库或外部依赖项
  • 您的应用程序的足迹应该更小,因为您不必包含额外的库。
  • 如果您与Google的互动有限,那么只需直接使用GoogleAuthUtil,而不是直接使用另一个库即可。
  • GoogleAuthUtil不应该那么难以使用,所以使用一个封装它来简化它的库可能不会那么容易使用。

我很困惑在哪个场景以及为什么使用哪一个。 我一直在使用方法号。 1成功…

如果您使用的是Google API客户端库,并且适用于您,那么我认为您不应该继续使用它。

但是,如果我要创build一个需要与Google服务交互的Android(仅)应用程序,我可能会直接使用GoogleAuthUtil。

…而不需要在喜好中保存令牌(我想这是由GoogleAccountCredential自动完成的)

是的,这个由GoogleAuthUtil自动处理,然后由GoogleAccountCredential使用。

如何在第一个方法中访问身份validation令牌?

您应该可以调用GoogleAccountCredential对象上的GoogleAccountCredential ()方法。

Google Play Services client library是专门为Android设备编写的,可以与各个Google服务和一致的用户界面进行无缝集成,从而获得用户使用凭据访问这些服务的授权。

Google APIs Client Library for Java是一个通用库,可从所有应用程序types(Web,安装或Android应用程序)访问Google服务。

回到Android,如果您要使用的Google API未包含在Google Play services library ,则可以使用适当的REST API进行连接,但必须获得OAuth 2.0令牌。

要获得一个令牌,你可以 –

  • 直接使用Google API客户端库中的OAuth 2.0库(不适用于Android)

  • 或者使用GoogleAuthUtil和AccountPicker来利用Google Play服务库的授权部分。 阅读使用Google授予REST API的权限。 ( GoogleAuthUtil.getToken()caching和pipe理令牌到期并自行刷新,但是如果发生networking错误/服务器负载,在重试令牌之前可能需要使用指数退避algorithm,以避免服务器发出请求。)

  • 或者使用随Google API客户端库Java GoogleAccountCredential附带的google-api-client-android-1.19.0.jar中打包google-api-client-android-1.19.0.jar 。 该软件包提供基于Google Play服务客户端库的 Utilities,而GoogleAccountCredential is just a wrapper GoogleAuthUtilAccountPicker GoogleAccountCredential is just a wrapper 。 这将允许您使用相同的一致性授权stream程和来自Google Play服务客户端库的标准帐户select器对话框,同时将令牌pipe理委托给GoogleAccountCredential 。 参考这个例子。

方法一(com.google.api.client.googleapis.extensions.android.gms.auth。*)是Google更一般的跨平台账户pipe理stream程的一部分,而方法二(com.google.android.gms。 auth.GoogleAuthUtil)是Android特有的。 它看起来像各种Android的Google API,方法二,包装和简化方法一。 例如, Google+文档第二段提到“Google+loginbutton对用户进行身份validation并pipe理OAuth 2.0stream程,这简化了您与Google API的集成。”

我会在Android的具体方法, token = GoogleAuthUtil.getToken(mActivity, mEmail, mScope),只要有可能。