Android:Google Drive onActivityResult() 获取 resultCode 0 (RESULT_CANCELED)

KT_*_*KT_ 4 android google-authentication google-drive-api

我一直在搜索 Google 文档和示例代码以及 Stack Overflow 以寻求解决方案,虽然我看到很多人遇到了相同的症状,但我没有找到任何对我的特定情况有帮助的东西。

基本上,我正在尝试为 Google Drive REST API 执行身份验证工作流程,虽然我到达了 Google 帐户选择页面,但当它返回到我的调用活动时,我总是看到 RESULT_CANCELED 的结果(即, 0) 而不是 RESULT_OK(即 -1),无论选择什么帐户。

我已经检查以确保在 Google 开发人员控制台上正确设置了凭据 - 他们以前通过现已解散的 CloudRail 库进行身份验证。(据我所知,现在使用 Google 登录,您无需提供任何客户端 ID 等:当它与您的包名称匹配时,所有这些都由 Google 处理。)

这是我对身份验证的要求:

    GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestScopes(new Scope(DriveScopes.DRIVE))
            .build();
    mSignInClient = GoogleSignIn.getClient(activity, signInOptions);
Run Code Online (Sandbox Code Playgroud)

这是活动的onActivityResult()

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    switch (requestCode) {
        case REQUEST_GOOGLE_SIGN_IN:
            if (resultCode == Activity.RESULT_OK && resultData != null) {
                /*** NEVER GET HERE ***/
                handleSignInResult(this, resultData);
            }
            else {
                /*** ALWAYS GET HERE ***/
                Log.e(TAG, String.format("Unable to complete Google sign-in (resultCode: %d)", resultCode));
            }
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, resultData);
}
Run Code Online (Sandbox Code Playgroud)

我假设这是一个我做了一些明显愚蠢和错误的事情 - 并且希望仅仅输入问题就可以帮助我弄清楚它是什么,但这还没有发生。

KT_*_*KT_ 5

正如我所料,我做错了一些相对简单的事情。因此,对于任何遇到相同问题并在寻找解决方案时越过我的身体的人,这是我发现的:

虽然我确实在 Google 开发人员控制台中正确设置了凭据,并按照文档的指示从 mykeystore.keystore 生成了我的包名称和 SHA1,但我错过的是 Android Studio没有使用 mykeystore 对调试版本进行签名。默认情况下的密钥库。相反,它使用自己提供的 debug.keystore。

因此,要做的是使用您的包名称和来自 Android Studio 的 debug.keystore 而不是自己的 SHA1 创建一个新的 OAuth 客户端 ID。(您可以在系统上查找 debug.keystore,或运行 Gradle“signingReport”任务并从那里获取它。)

希望能帮助某人。


小智 1

首先,很可能这一切都会发生,因为您从 Google Drive API 控制台添加了 credential.json。我建议您在 Firebase 控制台中创建一个项目并添加其 google.json 以进行身份​​验证。

在 onActivityResult 中,您可以使用以下代码检查错误代码:

  @Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (callbackManager != null) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
    super.onActivityResult(requestCode, resultCode, data);
    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            // Google Sign In was successful, authenticate with Firebase
            GoogleSignInAccount account = task.getResult(ApiException.class);
            handleSignInResult(account);
        } catch (ApiException e) {
            // Google Sign In failed, update UI appropriately
             System.out.println("errorCode = " + e.getStatusCode());// Print this error code on your console 
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

如果错误代码是 12500,那么您的密钥验证有问题,因此您需要创建一个 firebase 项目并添加您的计算机 SHA1 代码,然后在应用程序根文件夹中使用其 google.json 文件。