谷歌登录 API 异常 10

新手上路,请多包涵

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

应用程序配置错误。此错误不可恢复,将被视为致命错误。开发商是个傻逼。。。

我应该怎么做才能处理这个问题(获得一个帐户)并最终从帐户中检索值?

预先感谢您的帮助!!!

主要活动:

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

        }

}

原文由 max podgorny 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

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

  1. 打开安卓工作室
  2. 打开你的项目
  3. 单击 Gradle(在右侧面板中,您将看到 Gradle Bar)
  4. 点击 Refresh(点击 Refresh from Gradle Bar,你会看到 List Gradle scripts of your Project)
  5. 单击您的项目(您的项目名称表单列表(根))
  6. 点击任务
  7. 点击安卓
  8. 双击 signingReport(您将在运行栏中获得 SHA1 和 MD5(有时它会在 Gradle 控制台中))
  9. 从模块选择下拉列表中选择应用程序模块以运行或调试您的应用程序您还需要从 firebase 控制台获取 google-services.json 并将其放入您的项目中。

原文由 Patrick R 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

  1. Web应用程序
  2. 安卓

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

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

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

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

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

原文由 Shyam Swaroop 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏