Google SignIn API异常10

max*_*rny 5 java android google-signin googlesigninaccount googlesigninapi

接近认证的最后阶段,但是handleSignInResult方法出了点问题。它在日志中返回异常代码10(开发人员错误)。Google提供了全面的描述:

应用程序配置错误。该错误不可恢复,将被视为致命错误。开发者是个白痴...

我该怎么办(获取帐户)并最终从帐户中检索值?
预先感谢您的帮助!!!

主要活动:

package ru.podgorny.carcall;

import ...

public class MainActivity extends AppCompatActivity {

        SignInButton signInButton;
        public static final int RC_SIGN_IN = 07;
        public static final String TAG = "MainActivity";
        TextView tw1;
        TextView tw2;


        GoogleSignInOptions gso;
        GoogleSignInClient mGSC;


        @Override
        protected void onCreate (Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "Activity Works");
        findViews();

            gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestEmail()
                    //.requestProfile()
                    .build();

            mGSC = GoogleSignIn.getClient(this, gso); //smth with mGSC variable....

             View.OnClickListener onClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onClick2(v);
                }
            };
             signInButton.setOnClickListener(onClickListener);




    }

    private void findViews() {
            Log.d (TAG, "findViews started");
        signInButton = findViewById(R.id.idButtonGoogle);

        tw1 = findViewById(R.id.textView1);
        tw1 = findViewById(R.id.textView2);

        Log.d(TAG, "Views finded");


    }

    public void onClick2(View view) {
            Log.d(TAG, "onClick started");
        switch (view.getId()) {
            case R.id.idButtonGoogle:
                signIn();
                break;
        }
        Log.d(TAG, "OnClick Started");
    }

    public void signIn() {

        Intent signInIntent = mGSC.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
        Log.d(TAG, "startActivityForResult works");

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "OnActivityResult started");
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Log.d(TAG, "TASK started");
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
            Log.d(TAG, "OnActivityResult returned");
        }
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);//ERROR -- Code 10
            Log.d(TAG, "Account received");


            updateUI(account);
            Log.d(TAG, "updateUI Launched");
        } catch (ApiException e) {

            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    private void updateUI(GoogleSignInAccount account) {
            if (account!=null) {
                tw1.setText("OK");
                tw2.setText("Name: " + account.getGivenName() + ", Family name: " + account.getFamilyName() + ", Email: " + account.getEmail() /*+ " image: " +
                        account.getPhotoUrl()*/);
            }else {
                tw1.setText("SMTH wrong");
            }

        }

}
Run Code Online (Sandbox Code Playgroud)

Shy*_*oop 12

我遇到了同样的问题并浪费了时间。在深入研究 OAuth 和 OpenId 后,我找到了原因。我们在这里犯了一个概念错误。

对于android或任何其他平台(web除外),您需要在google API控制台的同一个项目中创建至少两种类型的客户端id。这些客户端 ID 类型是:

  1. Web应用程序
  2. 安卓

您可以按任何顺序创建它们。创建 Android 类型的客户端 ID 时,您需要提供包名称和 SHA1。在创建 Web 应用程序 ID 时,您只需要提供一个名称。

在您想在后端验证用户之前,您无需对这些 id 中的任何一个进一步执行任何操作。换句话说,如果你想让你的后端服务器向谷歌服务器询问这个用户的信息,那么你只需要 Web 应用程序 ID。概念流程如下:

  1. 首先使用 requestIdToken(your_web_app_client_id) 将 Web 应用程序客户端 ID 作为附加选项从 Android 应用程序发送到 Google 登录服务器。
  2. 用户登录后,您将在 Android 应用程序中取回令牌。
  3. 将此令牌发送到您的后端。
  4. 现在您的后端可以与 Google 服务器交换此令牌以获取用户信息

将此 Web 应用程序客户端 ID 从 Android 应用程序发送到后端服务器。

如果您想在后端验证用户,请使用此 Web 应用程序 ID。


Pat*_*k R 9

如果您不在console.developers.google和console.firebase.google.com上使用同一项目,则可能会发生此错误。如果两个控制台上的项目相同,请确保已正确添加SHA1密钥。从Android Studio 获取SHA1。

  1. 开启Android Studio
  2. 打开你的项目
  3. 单击Gradle(在右侧面板中,您将看到Gradle Bar)
  4. 单击刷新(在Gradle Bar中单击Refresh,您将看到列出项目的Gradle脚本)
  5. 单击您的项目(您的项目名称表单列表(根))
  6. 点击任务
  7. 点击Android
  8. 双击signingReport(在运行栏中您将获得SHA1和MD5(有时将在Gradle控制台中))
  9. 从模块选择下拉列表中选择应用程序模块以运行或调试您的应用程序?您还需要从Firebase控制台获取google-services.json并将其放入您的项目中。

  • 如果您使用 Play 应用签名,请确保使用其证书中的 SHA1,而不是调试或发布密钥库 (2认同)
  • @PrasadDeZoysa 在我使用正确的应用程序包名称和来自 Google Play 控制台的 SHA1 指纹将另一个 Android OAuth 客户端添加到云控制台后,我仍然收到错误代码 10。在设备/模拟器上运行调试版本甚至发布版本(使用我们的密钥库签名)时,登录可以正常工作。但是,当将 aab 上传到 Google Play 内部测试时,我收到此错误 10。您知道还有什么问题吗?提前致谢! (2认同)

hug*_*ige 7

对我来说,答案是您实际上需要结合此处给出的两个主要答案:

  1. 确保您为 Android 创建了 Google OAuth 客户端 ID(一个用于调试,一个用于发布),然后确保他们已按照接受的答案中的描述分配了正确的 SHA1。

  2. 然后,您还需要为 Web 创建一个 OAuth 客户端 ID并将其用于实际登录:

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(WEB_CLIENT_ID)
        .requestEmail()
        .build();               
    
    Run Code Online (Sandbox Code Playgroud)


小智 7

这个问题可以通过使用WebApplication ID和android Client ID来解决

当您配置项目为 android 应用程序生成 id 时,它会生成 2 种类型的 ids 1 Android 2 WebApplication ,

我们需要使用第二个(网络 oAuth id)而不是第一个,它将解决您的问题


Her*_*him 5

此错误的另一个来源是将applicationIdSuffix添加到gradle 文件中的构建变体(风味)中。如果一切正常,但在添加口味时 Google 登录突然中断,请检查此配置变量。

applicationIdSuffix参数可能需要每个后缀的唯一证书。我只是将其删除,因为我还不需要部署不同的产品或版本。此外,您还可以通过编程方式为每种风格设置相同的配置。

配置证书构建类型:强制使用相同的证书来签署为特定“productFlavor”配置的不同“buildTypes”?


小智 5

我找到了问题的另一个根源。

就我而言,键没问题,但build.gradle脚本中的applicationId字段与应用程序的包名称不同。

小型研究表明,applicationId字段值在涉及 Google 身份验证的应用程序包名称之前具有某种“优先级”。

在build.gradle中注释掉applicationId行后,应用程序会通过包名称在 Google 中验证自身。


Md.*_*lla 5

我通过这种方式解决了这个问题

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.AUTH_ID))
                .requestEmail()
                .build();
Run Code Online (Sandbox Code Playgroud)

我的 AUTH_ID 在哪里在此输入图像描述