Google SignIn API Exception 10

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

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

我应该如何处理这个问题(获取帐户)并最终从帐户中检索值?
提前感谢您的帮助!!!

主要活动:

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");
            }

        }

}

答案 1

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

  1. 开放安卓工作室
  2. 打开项目
  3. 单击Gradle(从右侧面板中,您将看到Gradle栏)
  4. 单击“刷新”(单击“从 Gradle 栏刷新”,您将看到项目的“列出 Gradle 脚本”)
  5. 单击“您的项目”(“您的项目名称”窗体“列表(根)))
  6. 点击任务
  7. 点击安卓
  8. 双击签名报告(您将在运行栏中获得SHA1和MD5(有时它将在Gradle控制台中))
  9. 从模块选择下拉列表中选择应用程序模块以运行或调试应用程序 您还需要从firebase控制台获取google-services.json并将其放入您的项目中。

答案 2

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

对于Android或任何其他平台(网络除外),您需要在Google API控制台的同一项目中创建至少两种类型的客户端ID。这些客户端 ID 类型包括:

  1. 网络应用程序
  2. 人造人

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

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

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

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

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


推荐