Android Google Plus 登录问题。 handleSignInResult 返回 False

Posted

技术标签:

【中文标题】Android Google Plus 登录问题。 handleSignInResult 返回 False【英文标题】:Android Google Plus sign in issue. handleSignInResult returns False 【发布时间】:2016-05-02 16:48:27 【问题描述】:

我在集成 Google+ 登录功能时遇到了一些问题。到目前为止,我已经集成了所有必要的 G+ 登录 API 模块和代码,这些模块和代码运行良好,在使用 debug.keystore 的 keytool 生成 SHA1 并将 SHA1 粘贴到谷歌云后,生成并将 google-services.json 放置在 /app 中开发人员控制台,但现在我只面临一个小故障,因为很多天/几周,即当我尝试进行设备调试时,每当我点击“G+登录”时,我在 LogCat 中收到以下错误:

E/GMPM:getGoogleAppId 失败,状态为:10

E/GMPM:无法上传。应用测量已禁用。

D/SignInActivity:handleSignInResult:false

此 handleSignInResult 一直返回 False,无法登录以进一步获取数据。如果你们中的任何人曾经遇到过这种情况,请在这里帮助我。这个小障碍非常令人抓狂。

谢谢大家。

【问题讨论】:

尝试使用 Google 示例进行 g+ 登录。代码保持不变。您需要做的就是生成 google-services.json。在棉花糖运行时检索用户的电子邮件也需要权限 @Raghunandan 感谢您的回复,我已经使用了示例并且一切正常,前往开发者控制台为 G+ 登录和 GCM 生成通用 google-services.json 并将其放在 /app目录,当我在我的设备上测试它并尝试登录时,屏幕会在几秒钟内淡入淡出,它仍然在 LogCat 中给出 handleSignInResult:false 而我从示例中复制了代码,并根据我的要求并遵循 Google+ 登录集成教程中提供的所有必要步骤。 我不明白这个为 G+ 生成通用 google-services.json。需要根据应用名和包名重新生成文件。 @Raghunandan 我的意思是,我正在使用 Google 的 2 个 API,1)GCM API 和 2)G+ 登录 API。所以早些时候我只需要 GCM 推送通知,它工作得很好。现在根据新要求,我想将 G+ 登录集成到同一个应用程序中,并再次生成一个新的 google-services.json,它同时具有 GCM 和 G+ 登录的配置,下载它,粘贴新下载的 google-services .json 到 app/ 目录。代码运行良好,应用程序运行而不会崩溃,但是当我单击“G+ 登录”时,应用程序会在 LogCat 中抛出:D/SignInActivity:handleSignInResult:false 我遇到了同样的问题,解决方案很愚蠢。我不知道我关闭了互联网连接并试图调试应用程序。该错误非常具有误导性且不清楚,因为我刚刚收到错误代码 12501,而没有任何关于没有网络连接的信息。希望它可以帮助别人。 【参考方案1】:

您使用的是 Plus.API 还是 Auth.GOOGLE_SIGN_IN_API?后者是最新改版的。在这里查看: https://developers.google.com/identity/sign-in/android/sign-in


如果您使用的是 Auth.GOOGLE_SIGN_IN_API:

在onActivityResult中,使用类似下面的代码可以得到一个状态码,由GoogleSignInStatusCodes定义:https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInStatusCodes

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) 
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        int statusCode = result.getStatus().getStatusCode();
    

最常见的问题是缺少正确的 OAuth2 客户端注册。 (不幸的是,目前状态码是 INTERNAL_ERROR 8,这没有帮助。)看看这个线程: Occured an INTERNAL_ERROR when requestEmail from GoogleSignInOptions Android

【讨论】:

嗨@Isabella,我正在使用后者,根据文档,我已经逐步遵循它们并实现了所有内容。现在,当我尝试在我的设备上登录时,该应用程序要求选择帐户,当我选择登录帐户时,设备屏幕会变暗几秒钟以尝试登录,然后什么也没有发生。当我检查 LogCat 时,我得到了同样的错误:E/GMPM: getGoogleAppId failed with status: 10E/GMPM: Uploading is not possible. App measurement disabled.D/SignInActivity: handleSignInResult:false 内联更新了答案 对我来说,除了新帐户外一切正常,当我添加新的谷歌帐户时,什么都不会发生......成功时我有时可以看到半透明覆盖,然后如果我点击标志它会自动退出在按钮 agian 这次发生自动登录...我的问题是为什么添加新帐户后无法恢复操作 @Bytecode 你能粘贴你的 GoogleSignInOptions 吗?支持添加新帐户的方案,我无法重现。 @IsabellaChen GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestIdToken("xxxxx") .build();【参考方案2】:

请确保您在创建google-services.json 文件时应用了SHA-1 调试密钥。

【讨论】:

阿汉我会记住这一点的。到目前为止,我已经删除了 Google 登录,并计划在我的应用的下一个版本中添加它:) 如您所愿,但请记住应用 SHA-1 密钥以及两个客户端 ID 以使用 FCM 启用 google 身份验证 是的,如果有任何问题会发布,谢谢:)【参考方案3】:

正如 Sudhanshu Gaur 在this post 中指出的那样,首先尝试使用与create your json configuration file 相同的密钥生成签名的apk。然后将其安装在您的设备上,看看它是否有效。原因是当您单击“运行”时,Android Studio 不会签署您的 apk。 我被困在完全相同的问题上,这个修复对我来说很好。

【讨论】:

阿汉,没错,发现集成登录非常混乱。但我想我最终会以某种方式设法整合。我面临的问题是当我必须在一个表单上集成 FB 登录和 G+ 登录时。也许这与我是一名中级 android 程序员有关。感谢您的努力,尽管指出:)【参考方案4】:

如果您在 firebase 中添加所有 SHA-1 指纹仍然会出现错误。那么(我遇到了这个问题。在此步骤之后它已解决。)尝试以下步骤:

1.转到Google Console API credentials页面。

2.单击左侧选项卡中的凭据

3. 已经存在两个默认的 Android 和 Web OAuth 客户端 ID。您必须创建 一个 Android 客户端 和一个 Web 2.0 客户端

4.转到Firebase。在项目设置中,下载 google-services.json 并粘贴到应用文件夹中。

(一切都很好,但您仍然无法登录 google,这意味着可能是 OAuth 问题。所以请确保创建 Android 和 Web 客户端 ID。最后在凭证页面中,您有 2 个 Android 客户端和两个 Web 客户端 ID。)

【讨论】:

在我的情况下,我正在更新一个项目,由于某种原因,SHA-1 发生了变化。然后我将新的添加到 Firebase 控制台的允许列表中,它正在工作。谢谢。【参考方案5】:

您需要在您的应用上提供签名证书的 SHA-1 哈希

示例:

已注册的 SHA-1:

CF:4A:A1:0A:BC:84:F2:31:28:C3:BA:A7:A3:A2:36:10:5F:1D:3E:CB 并下载您创建的配置文件..并替换为 *yourproject/app/google-service.json

//获取google-service.json文件教程 https://developers.google.com/identity/sign-in/android/start-integrating

//如何获取SHA-1 https://developers.google.com/android/guides/client-auth

【讨论】:

【参考方案6】:

请检查您添加的 SHA-1 密钥是调试还是发布,根据您的密钥其工作相对于它。 我有同样的问题拿铁我知道我使用了版本 SHA-1 并且我正在调试测试然后它会得到错误的结果。 谢谢

【讨论】:

【参考方案7】:

先生成调试密钥:

keytool -exportcert -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore

然后将 SHA1 粘贴到指纹部分的 Firebase 或 Google 项目设置中。

【讨论】:

【参考方案8】:
package com.google.samples.quickstart.signin;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;

/**
 * Activity to demonstrate basic retrieval of the Google user's ID, email address, and basic
 * profile.
 */
public class SignInActivity extends AppCompatActivity implements
        View.OnClickListener 

    private static final String TAG = "SignInActivity";
    private static final int RC_SIGN_IN = 9001;

    private GoogleSignInClient mGoogleSignInClient;
    private TextView mStatusTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_DEMO);

        // Views
        mStatusTextView = findViewById(R.id.status);

        // Button listeners
        findViewById(R.id.sign_in_button).setOnClickListener(this);
        findViewById(R.id.sign_out_button).setOnClickListener(this);
        findViewById(R.id.disconnect_button).setOnClickListener(this);

        // [START configure_signin]
        // Configure sign-in to request the user's ID, email address, and basic
        // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();
        // [END configure_signin]
        // [START build_client]
        // Build a GoogleSignInClient with the options specified by gso.
        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
        // [END build_client]

        // [START customize_button]
        // Set the dimensions of the sign-in button.
        SignInButton signInButton = findViewById(R.id.sign_in_button);
        signInButton.setSize(SignInButton.SIZE_STANDARD);
        signInButton.setColorScheme(SignInButton.COLOR_LIGHT);
        // [END customize_button]
    

    @Override
    public void onStart() 
        super.onStart();

        // [START on_start_sign_in]
        // Check for existing Google Sign In account, if the user is already signed in
        // the GoogleSignInAccount will be non-null.
        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
        updateUI(account);
        // [END on_start_sign_in]
    

    // [START onActivityResult]
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);

        // 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.
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        
    
    // [END onActivityResult]

    // [START handleSignInResult]
    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) 
        try 
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);

            // Signed in successfully, show authenticated UI.
            updateUI(account);
         catch (ApiException e) 
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        
    
    // [END handleSignInResult]

    // [START signIn]
    private void signIn() 

        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);

       /* Intent sign = mGoogleSignInClient.getSignInIntent ();
        startActivityForResult ( sign, RC_SIGN_IN );*/

    
    // [END signIn]

    // [START signOut]
    private void signOut() 
        mGoogleSignInClient.signOut()
                .addOnCompleteListener(this, new OnCompleteListener<Void>() 
                    @Override
                    public void onComplete(@NonNull Task<Void> task) 
                        // [START_EXCLUDE]
                        updateUI(null);
                        // [END_EXCLUDE]
                    
                );
    
    // [END signOut]

    // [START revokeAccess]
    private void revokeAccess() 
        mGoogleSignInClient.revokeAccess()
                .addOnCompleteListener(this, new OnCompleteListener<Void>() 
                    @Override
                    public void onComplete(@NonNull Task<Void> task) 
                        // [START_EXCLUDE]
                        updateUI(null);
                        // [END_EXCLUDE]
                    
                );
    
    // [END revokeAccess]

    private void updateUI(@Nullable GoogleSignInAccount account) 
        if (account != null) 
            mStatusTextView.setText(getString(R.string.signed_in_fmt, account.getDisplayName()));

            findViewById(R.id.sign_in_button).setVisibility(View.GONE);
            findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE);
         else 
            mStatusTextView.setText(R.string.signed_out);

            findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
            findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE);
        
    

    @Override
    public void onClick(View v) 
        switch (v.getId()) 
            case R.id.sign_in_button:
                signIn();
                break;
            case R.id.sign_out_button:
                signOut();
                break;
            case R.id.disconnect_button:
                revokeAccess();
                break;
        
    
 

【讨论】:

强烈建议您添加一些关于您的答案的信息。

以上是关于Android Google Plus 登录问题。 handleSignInResult 返回 False的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Google Plus 登录,出现 com.google.android.gms.common.api.ApiException: 10:

如何从 google plus 帐户中注销 google plus 在 android 中的集成

如何在我的 Android 应用程序中集成 google+ 登录?

模拟器中的 Google Play 服务,实现 Google Plus 登录按钮等

如何在多项活动中正确使用 Google Plus 登录?

Android - 如何在 android 中检索 google plus circles 电子邮件地址?