我正在编写一个使用 Google Drive API 的 Android 应用程序。如果用户选择将应用程序与其 Google 云端硬盘同步,我将使用 Drive.SCOPE_APPFOLDER 来拥有一个私人位置来放置我的应用程序数据。在大多数情况下,一切正常,我可以将内容同步到 Google 云端硬盘。然而,我在初始化方面遇到了很大的困难。首先,我可以识别用户何时未使用 Google Drive 并启动登录活动。这是我构建谷歌登录客户端的方法。我实际上并不认为我需要 .requestEmail() 和 .requestProfile() 但它现在就在那里。
private GoogleSignInClient buildGoogleSignInClient(AppCompatActivity activity) {
GoogleSignInOptions signInOptions =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(Drive.SCOPE_APPFOLDER)
.requestEmail()
.requestProfile()
.build();
return GoogleSignIn.getClient(activity, signInOptions);
}
为了识别用户尚未登录 Google 云端硬盘或通过应用程序使用云端硬盘,我有以下代码。
private void initGoogleClient() {
mGoogleSignInAccount = GoogleSignIn.getLastSignedInAccount(getActivity());
if (mGoogleSignInAccount == null) {
launchSigninActivity(getActivity());
} else {
mDriveResourceClient = Drive.getDriveResourceClient(getActivity().getApplicationContext(), mGoogleSignInAccount);
//.... doing stuff here that works fine
}
}
要启动登录活动,我有以下代码。
private void launchSigninActivity(AppCompatActivity activity) {
mGoogleSignInClient = buildGoogleSignInClient(activity);
Intent signinIntent = mGoogleSignInClient.getSignInIntent();
activity.startActivityForResult(signinIntent, SIGNIN_INTENT_CODE);
}
现在登录活动启动得很好,用户可以登录他们的 Google 帐户。但是,每当显示 Google UI 以登录用户时,都会引发错误代码 code=8 INTERNAL_ERROR。如果用户在使用我的应用程序之前已经登录过他们的云端硬盘帐户,则不会抛出错误代码 8。
public void handleSignIn(int requestCode, int resultCode, Intent data) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
mGoogleSignInAccount = task.getResult(ApiException.class);
mDriveResourceClient = Drive.getDriveResourceClient(getActivity().getApplicationContext(), mGoogleSignInAccount);
//... other App specific stuff
} catch (ApiException e) {
Log.w(TAG, "************* signInResult:failed code=" + e.getStatusCode());
}
}
(我的活动中的 onActivityResults() 调用上面的代码) getActivity() 方法仅返回处理 onActivityResults() 的活动。
我注意到的第二个问题是,第一次使用我的应用程序时使用 GoogleResourceClient 时存在一些计时问题。前几次我尝试读取驱动器,它似乎是空的,但在某些时候远程文件会显示出来。我没有描述读取查找文件之前需要多长时间,但似乎驱动器 API 在初始/首次应用程序使用调用时对远程驱动器的任何调用之前返回。
这些问题仅在首次使用 Android 应用程序时发生。该应用程序的所有后续启动都运行顺利。大家对这些问题有什么想法吗?
Google 已弃用此库。移动 Google Drive REST API。
人们仍在寻找 Google Drive API 相关问题,Google 已准备了一个示例应用程序来展示新的 V3 API(并且您需要迁移):
https://github.com/googleworkspace/android-samples/tree/master/drive/deprecation
这对我来说是一个很大的帮助。
迁移须知 https://developers.google.com/drive/api/guides/migrate-to-v3
@masterjunk - 您需要 requestEmail(),因为没有它,Drive API 将无法工作