OAuth2是否已经过时?

10

我一直在开发一款使用Google Drive API的Android应用程序。它最初是基于此处的快速入门示例构建的。API调用的简化序列(这里没有展示适当的错误处理)如下:

 GoogleAccountCredential cred = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE_FILE);
 cred.setSelectedAccountName("...");  
 Drive drvSvc = new Drive.Builder (AndroidHttp.newCompatibleTransport(), new GsonFactory(), cred).build();
 FileList gooLst = drvSvc.files().list().setMaxResults(MAX_DOWN).setQ(_rqst).execute();

一切运作良好,我即将发布我的应用。但是突然,在Drive API更新之后,我收到了一个警告。

类型GoogleAccountCredential中的usingOAuth2(Context, String, String...)方法已过时

发生了什么?是否有另一种方式来获取凭据?是否有快速入门示例的编辑版本可用?

感谢您提前的任何澄清。肖恩

2个回答

27

所以,对于我的问题而言,简单的答案是:

将:

GoogleAccountCredential crd = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE_FILE);

替换为:

GoogleAccountCredential crd = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE_FILE));


这里还有一个相关链接:https://developers.google.com/google-apps/tasks/oauth-and-tasks-on-android - RaymondMachira
@seanpj,即使在GAC中也会出现相同的“未找到类定义错误”,并且该行也是如此。 - Karthick M

2

为了完整性

我猜你是通过Google Drive QuickStart中的代码示例进入这个异常页面的。如果是这样,你可能会发现我需要修改以下内容。

Google Play Services Lib(注意下面的评论!)

文档使用了将库添加到Android项目的旧方法。但在最新的ADT上执行时会失败。你可以编译并上传到设备/模拟器上,但在执行时会出现NoClassDefFoundError错误。

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/AccountPicker;

要解决这个问题,你应该将google-play-services.jar文件复制并粘贴到libs文件夹中。

缺少meta标签

接下来是另一个错误。我收到了一个IllegalStateException错误,并得到添加一个包含google-play-services版本信息的meta标签在清单中的指示。
所以,在清单的应用程序标签中添加如下内容:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>

在资源文件中的一个文件(res/values/a-file-here.xml)中添加以下内容:

<integer name="google_play_services_version">4030500</integer>

在我的情况下,这个库匹配了这个版本。如果你在这里输入错误的版本,你会得到一个错误提示,显示正确的版本。所以一定要检查输出。

权限被拒绝

最后,我在应用程序中得到了一个oauth提示,只是发现示例应用程序仍然缺少一个权限。参考错误信息:

java.io.FileNotFoundException: /storage/emulated/0/Pictures/IMG_20131211_110629.jpg: open failed: EACCES (Permission denied)

除了示例中列出的权限外:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />

同时在你的清单文件中添加WRITE_EXTERNAL_STORAGE权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

更多资源

如果你遇到了一个com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException的异常,并且在根本原因中某个地方显示了Unknown,那么你应该检查一下Google API控制台中的设置。我在包不匹配时收到了这个错误。

其他有用的链接包括OAuth2文档google api playground


关于库文件,我认为仅仅复制jar文件是不够的。请参考https://dev59.com/-GMl5IYBdhLWcg3w3aA- - pinoyyid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接