频繁登录和退出后Google登录失败

问题描述:

我可以首次使用Google帐户登录我的应用。 一切都很好。频繁登录和退出后Google登录失败

但是如果我在一两分钟内登出约20次。 Google登录失败,并在onActivityResult函数中返回错误码12501,resultCode = 0;

我使用的手机:6的Nexus的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,则此错误从未发生过。如果我从谷歌播放商店下载,此错误发生。但这两个apks之间没有区别,因为我提供的是本地的google商店。

+0

粘贴你的logcat –

+0

@RavishSharma我张贴我的logcat,但不知道为什么会发生 – chevy1006

+0

http://www.androidwarriors.com/2016/02/google-plus-integration-in-android-sign.html请检查这个链接...它可能会帮助你 –

最后我找到了原因。 我的apk由我们公司的发布程序再次签署。 该过程使用另一个密钥库,以便更改我的sha1密钥。 我在google开发控制台中配置了新的sha1键,这个bug已经解决了。

但我仍然困惑,如果我使用调试密钥库apk,成功登录并卸载它,然后我安装谷歌播放apk有不同的sha1键,谷歌登录可以工作一些times.It不会立即告诉我错误。

+0

这可能是一个菜鸟问题,但是您能描述一下您可以在Google Dev控制台中配置sha1键的位置吗? –

+0

@XavierPortebois是的,我不知道我们公司的发布程序。我使用firebase云消息传递,sha1键在[firebase](console.firebase.google.com)的控制台中设置。或者,如果您不需要Firebase,则可以在[此处](https://developers.google.com/mobile/add?platform=android)对其进行配置。 – chevy1006

+0

我发现经过一番斗争。我从来没有在“签署你的应用程序”文档中看过你必须通过开发控制台注册已签名的APK,但无论如何,现在完成了。 对于有同样问题的人,如果你仍然坚持,你可以检查我自己的一步一步,也许它可以帮助:http://*.com/a/41012703/923712 –

如果你的代码在第一次运行良好,然后 你可以尝试这种方式,

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 

对不起,我的英文。 我希望这会帮助你。感谢

+1

我也发现了一件奇怪的事情。如果我安装的是本地构建的apk,这个错误从来没有发生。如果我从谷歌播放商店下载,这个错误发生。但这两个apks之间没有区别,因为我提供与本地的谷歌商店。 – chevy1006

+0

你是对的,我的SHA1键出于某种原因错了[这里是原因](http://*.com/a/40988326/7244483) – chevy1006

尝试解决这个SO question,通过改变你的代码,并使用此代码

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

欲了解更多信息,请检查该另一个SO question如果它可以帮助你。

+0

我读了这个问题,而不是完全相同的原因。但感谢任何方式。 – chevy1006