频繁登录和退出后谷歌登录失败

Posted

技术标签:

【中文标题】频繁登录和退出后谷歌登录失败【英文标题】:Google sign in failed after frequent signing in and out 【发布时间】:2017-04-18 04:09:29 【问题描述】:

我可以先用 Google 帐户登录我的应用几次。 一切都很好。

但如果我在一两分钟内登录和退出大约 20 次。 谷歌登录失败,onActivityResult函数返回错误码12501,resultCode = 0;

我正在使用手机:Nexus 6、android 5.1.1

这是我的代码:

private GoogleSignInOptions mGso;
private GoogleApiClient mGac;

public void init(@NonNull final BaseActivity activity) 
    mGso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(activity.getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    mGac = new GoogleApiClient.Builder(activity)
            .enableAutoManage(activity /* FragmentActivity */, new GoogleApiClient.OnConnectionFailedListener() 
                @Override
                public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 
                    ToastUtils.show(activity, R.string.login_failed);
                
            )
            .addApi(Auth.GOOGLE_SIGN_IN_API, mGso)
            .build();


public void signIn(@NonNull final BaseActivity activity,
                   @NonNull GoogleSignInCallback callback,
                   @NonNull final OnLoadingListener<PlatformUserEntity> listener) 

    callback.registerCallback(listener);
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGac);
    activity.startActivityForResult(signInIntent, REQUEST_GOOGLE_SIGNIN);

    // disconnect the client
    mGac.stopAutoManage(activity);
    mGac.disconnect();


这里是gradle:

compile 'com.google.android.gms:play-services-base:9.6.1'
compile 'com.google.android.gms:play-services-gcm:9.6.1'
compile 'com.google.android.gms:play-services-auth:9.6.1'

首先,我用 FragmentActivity 初始化 GoogleApiClient,然后 signIn 函数启动 Acitvity。 GoogleSignInCallback 注册在 onActivityResult 函数中。然后断开客户端,因为每次点击登录按钮,都会调用init函数。

我怀疑我太早使用stopAutoManage(),但这似乎不是真的。 所以我很困惑,哪一部分可能是错的?

我注意到了日志:

Could not set socket write timeout: null
12-03 17:21:43.859 264-264/? W/SurfaceFlinger: couldn't log to binary event log: overflow.
12-03 17:21:43.902 1946-12870/? W/Conscrypt: Could not set socket write timeout: null
12-03 17:21:44.327 21168-21168/? W/AccountChipsFragment: Recording consent failed.
12-03 17:21:44.657 29359-29782/? E/TokenRequestor: You have wrong OAuth2 related configurations, please check. Detailed error: UNREGISTERED_ON_API_CONSOLE
12-03 17:21:44.664 812-1072/? W/ActivityManager: getRunningAppProcesses: caller 10145 does not hold REAL_GET_TASKS; limiting output
12-03 17:21:44.697 21168-21168/? W/AutoManageHelper: Unresolved error while connecting client. Stopping auto-manage.

上面写着“你的OAuth2相关配置错误”,但我可以在第一时间使用web客户端id来请求IdToken。

这只会让我更加困惑。

我还发现了一件奇怪的事情。如果我安装本地构建的 apk,则永远不会发生此错误。如果我从 google play store 下载,就会出现这个错误。但这两个 apk 之间没有区别,因为我用本地的提供谷歌商店。

【问题讨论】:

粘贴你的logcat @RavishSharma 我发布了我的 logcat 但不知道为什么会这样 androidwarriors.com/2016/02/… 请检查此链接...它可能对您有所帮助 @RavishSharma 好的,谢谢 欢迎您...... 【参考方案1】:

终于找到原因了。 我的apk被我们公司的发布程序再次签名。 该过程使用了另一个密钥库,因此我的 sha1 密钥已更改。 我在google开发控制台配置了新的sha1 key,这个bug解决了。

但我仍然很困惑,如果我使用调试密钥库 apk,成功登录并卸载它,然后我安装具有不同 sha1 密钥的 google play apk,google 登录可以工作几次。它赢了不要马上告诉我错了。

【讨论】:

这可能是一个菜鸟问题,但您能描述一下您可以在 google 开发控制台中配置 sha1 密钥的位置吗? @XavierPortebois 是的,我不知道我们公司的发布程序。我使用firebase云消息传递,sha1键是在[firebase](console.firebase.google.com)的控制台中设置的。或者,如果您不需要 firebase,可以在 here 进行配置。 经过一番挣扎,我发现了这一点。我从未在“签署您的应用程序”文档中读到您必须通过开发控制台注册已签署的 APK,但无论如何,现在已经完成了。对于有同样问题的人,如果你仍然卡住,你可以检查我自己的一步一步,也许它可以帮助:***.com/a/41012703/923712【参考方案2】:

通过更改您的代码并使用此代码来尝试此SO question 中的解决方案

mGso = newGoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(AuthenticatedActivity.this.getResources()
.getString(R.string.server_client_id))
.requestEmail()
.build();

有关更多信息,请查看另一个SO question,如果它可以帮助您。

【讨论】:

我读了这个问题,而不是完全相同的原因。但无论如何谢谢。【参考方案3】:

如果您的代码第一次运行良好,那么 你可以试试这样,

private GoogleSignInOptions mGso;
private GoogleApiClient mGac;

public void signIn(@NonNull final BaseActivity activity,
           @NonNull GoogleSignInCallback callback,
           @NonNull final OnLoadingListener<PlatformUserEntity> listener) 

    mGso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(activity.getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    mGac = new GoogleApiClient.Builder(activity)
            .enableAutoManage(activity /* FragmentActivity */, new GoogleApiClient.OnConnectionFailedListener() 
                @Override
                public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 
                    ToastUtils.show(activity, R.string.login_failed);
                
            )
            .addApi(Auth.GOOGLE_SIGN_IN_API, mGso)
            .build();

    callback.registerCallback(listener);
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGac);
    activity.startActivityForResult(signInIntent, REQUEST_GOOGLE_SIGNIN);

    // disconnect the client
    mGac.stopAutoManage(activity);
    mGac.disconnect();


或 正如您的日志所述:

 You have wrong OAuth2 related configurations, please check. Detailed error: UNREGISTERED_ON_API_CONSOLE

So, Problem can be:
    1. Sh1 key add in your api
    2. Api key type like for android or web
    3. Check Internet Connection

对不起,我的英语。 我希望这能帮到您。谢谢

【讨论】:

我还发现了一件奇怪的事情。如果我安装本地构建的apk,则不会发生此错误。如果我从google play store下载,则会发生此错误。但这两个apk之间没有区别,因为我提供的是本地的google store。 你是对的,我的 SHA1 密钥由于某种原因弄错了。here is the reason

以上是关于频繁登录和退出后谷歌登录失败的主要内容,如果未能解决你的问题,请参考以下文章

谷歌登录验证失败

appssr谷歌登录显示授权失败

追踪登录失败的账号

12306登录显示操作失败请检查时间设置是啥意思?

后台登陆防刷、防爆破以及正常的登录校验

谷歌游戏服务登录问题(第一次尝试失败,第二次成功)