android - 如何正确使用 Google Drive Rest API?
问题描述
我有一个应用程序,我想将 SQLite 数据库文件上传到用户的谷歌驱动器帐户。
由于 Google Android API 将停止工作,我想实现 REST API,实现 REST API 需要身份验证。我正在使用 Google 登录,但 REST API 需要某种类型的访问令牌。如何得到它?
我在开发者控制台中创建了一个帐户,启用了 Drive API,并为驱动器/身份验证添加了 Scope。
我使用官方文档https://developers.google.com/identity/sign-in/android/sign-in实现了登录功能
使用此代码,我可以获取用户的电子邮件并创建 DriveService,
GoogleSignInOptions googleSignInOptions = new
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(new Scope(DriveScopes.DRIVE))
.requestEmail()
.build();
googleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions);
Intent googleSignInIntent = googleSignInClient.getSignInIntent();
startActivityForResult(googleSignInIntent, REQUEST_CODE_SIGN_IN);
在活动结果中,我可以获得用户帐户,使用我创建 DriveServiceHelper 的帐户
mDriveServiceHelper = new DriveServiceHelper(getGoogleDriveService(getApplicationContext(), googleSignInAccount, "appName"));
现在的事情是当我尝试创建文件夹时它向我显示了一个关于(UserRecoverableAuthIOException)的错误,
查看我用来创建文件夹的代码
public Task<GoogleDriveFileHolder> createFolder(final String folderName, @Nullable final String folderId) {
return Tasks.call(mExecutor, new Callable<GoogleDriveFileHolder>() {
@Override
public GoogleDriveFileHolder call() {
GoogleDriveFileHolder googleDriveFileHolder = new GoogleDriveFileHolder();
List<String> root;
if (folderId == null) {
root = Collections.singletonList("root");
} else {
root = Collections.singletonList(folderId);
}
File metadata = new File()
.setParents(root)
.setMimeType(DriveFolder.MIME_TYPE)
.setName(folderName);
File googleFile = null;
googleFile = mDriveService.files().create(metadata).execute();
googleDriveFileHolder.setId(googleFile.getId());
return googleDriveFileHolder;
}
});
}
我尝试使用 StackOverflow 中提供的各种讨论线程来解决错误,但它们都不起作用,有人可以指导我完成这个吗?
解决方案
给定 an android.accounts.Account
,您可以使用AccountManager.blockingGetAuthToken
,将此标记设置在 aGoogleCredential
中,然后将其作为HttpRequestInitializer
to传递Drive.Builder
。
String token = AccountManager.get(context)
.blockingGetAuthToken(<android.accounts.Account>, "oauth2:" + DriveScopes.DRIVE, false);
GoogleCredential credential = new GoogleCredential().setAccessToken(token);
Drive service = new Drive.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
.setApplicationName("app name")
.build();
最终此令牌将过期,此时您将需要调用AccountManager.invalidateAuthToken
并获取一个新令牌
如果您已包含该play-services-auth
库,则可以改为传递此凭据:
GoogleAccountCredential credential = GoogleAccountCredential
.usingOAuth2(context, Collections.singleton(DriveScopes.DRIVE))
.setSelectedAccount(googleAccount.getAccount());
推荐阅读
- amazon-ec2 - AWS SSM 代理 cloudwatch 资源:内存事件吗?
- php - 指定时间之前的 PHP 日期
- javascript - 使用引导程序验证复选框
- java - 如何从滚动视图显示图像以及如何添加无限滚动?
- c - 在真值表上填充 n 个输入值
- python - Python 忽略了fleing_attempted 变量
- c# - 如何在 C# 中进行 SWIFT 代码和 IBAN 验证
- php - 使用 PHP 服务器进行 react-native 图像上传
- firebase - Firebase webpack + babel 功能未部署
- nestjs - 控制器的嵌套路由内的 Nestjs 验证失败(需要数字字符串)