【问题标题】:onConnectionFailed giving SIGN_IN_REQUIRED(4)onConnectionFailed 给 SIGN_IN_REQUIRED(4)
【发布时间】:2014-05-19 11:04:55
【问题描述】:

我正在开发一个想要使用 Google API 的 Android 应用程序。为此,我导入了 google-play-service-lib 项目。

我正在关注这个link 来初始化 GoogleApiClient 对象。

我的代码:

1) 在onCreate() 方法中,我正在构建GoogleApiClient 对象:

mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(Plus.API, null)
    .addScope(Plus.SCOPE_PLUS_LOGIN)
    .build();

2) 在onStart(),我打电话给mGoogleApiClient.connect()

3) 我的活动实现 ConnectionCallbacksOnConnectionFailedListener.

4) 我的onConnectionFailed() 方法如下所示:

public void onConnectionFailed(ConnectionResult result) {
    //in dubug result looks like : ConnectionResult{
    //statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent
                    // {41f8ca70: android.os.BinderProxy@41f8ca10}}
     try {
     if(!mIntentInProgress && result.hasResolution())
     {
         mIntentInProgress=true;
        result.startResolutionForResult(mActivity, RC_SIGN_IN);
          }

    } catch (SendIntentException e) {
        e.printStackTrace();
    }
}

5) 我的onActivityResult() 方法包含:

if (requestCode == RC_SIGN_IN) {
   if (!mGoogleApiClient.isConnecting()) {
      mGoogleApiClient.connect();
   }
}

当我运行我的应用程序时,我得到一个 Toast 表示弹出了一个内部错误。我确实在 Google 控制台中创建了该项目。

【问题讨论】:

    标签: android google-play google-play-services


    【解决方案1】:

    我遇到了同样的问题。

    来自文档: 客户端可以选择不使用 API 继续,也可以调用 startResolutionForResult(Activity, int) 提示用户登录。

    所以你应该尝试使用 startResolutionForResult() 函数登录

    @Override
    public void onConnectionFailed(ConnectionResult result) {
       if (result.hasResolution()) {
           try {
               // !!!
               result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
           } catch (SendIntentException e) {
               mPlusClient.connect();
           }
       }
    
       mConnectionResult = result;
    }
    

    【讨论】:

    • 如果登录意图失败,为什么要尝试在 catch 块内调用 mPlusClient.connect() ?那时,用户尚未登录,因此呼叫必然会再次失败。
    • 对我不起作用。在尝试 startResolutionForResult() 之后,我的 onConnected() 调用并收到了电子邮件,但在尝试获取此对象后收到的 Person 对象为 null。
    • 什么是 REQUEST_CODE_RESOLVE_ERR?我在 REQUEST_CODE_RESOLVE_ERR 上得到未解析的符号。
    • @nav_jan 这是他们自己编写的请求代码。您可以轻松设置private static int REQUEST_CODE_RESOLVE_ERR = 1000; 或任何您想要的正数。而不是用它来检查是否是在您的 onActivityResult() 中返回的写入调用。
    【解决方案2】:

    只要关注谷歌的instructionss

    注意

    由于您仍处于开发模式,请在发布游戏之前检查您是否在游戏详情中心添加了测试电子邮件地址。

    【讨论】:

    • 您必须添加设备中的谷歌电子邮件的部分对我有用。必须添加游戏服务-> 测试。谢谢
    • 谢谢!没有将电子邮件添加到测试人员的电子邮件列表中就是这样。
    【解决方案3】:

    检查您是否使用上传到 Google Play 开发者控制台的 apk 中的密钥库对应用程序进行签名(如果进行测试,您可以上传为 alpha 版本并在保持私密的同时发布)。

    如果不是这个,它可能是其他的东西。确保您帐户的电子邮件地址在帐户详细信息页面(在带有齿轮图标的设置菜单上)的测试人员中列出,并且许可响应设置为 LICENSED,而不是 RESPOND_NORMALLY

    【讨论】:

      【解决方案4】:

      此错误表明用户需要授权您的应用。有一个完整的工作流程,按照https://developers.google.com/+/mobile/android/getting-started 的教程查找“onConnectionFailed”

      【讨论】:

        【解决方案5】:

        应该从控制台页面启用驱动器 api。

        【讨论】:

          【解决方案6】:

          不确定这是否是最佳答案,但它对我有用。我从 BasicSamples TakeANumber MainActivity 中复制了 onConnectionFailed()。它调用 BaseGameUtils 来解决。当然,这意味着您的项目中包含了 BaseGameUtils 库,这是另一种蠕虫。但也许你可以用一种方法,所以我在下面复制了它。

          @Override
          public void onConnectionFailed(ConnectionResult connectionResult) {
             logger.info( "onConnectionFailed() *play* : attempting to resolve");
              if (mResolvingConnectionFailure) {
                 logger.info( "onConnectionFailed(): already resolving");
                  return;
              }
          
              if (mSignInClicked || mAutoStartSignInFlow) {
                  mAutoStartSignInFlow = false;
                  mSignInClicked = false;
                  mResolvingConnectionFailure = true;
                  if (!BaseGameUtils.resolveConnectionFailure(this, mGoogleApiClient, connectionResult,
                          RC_SIGN_IN, getString(R.string.signin_other_error))) {
                      mResolvingConnectionFailure = false;
                  }
              }
          }
          

          来自 Google BasicSamples BaseGameUtils.java:

           public static boolean resolveConnectionFailure(Activity activity,
                                                         GoogleApiClient client, ConnectionResult result, int requestCode,
                                                         String fallbackErrorMessage) {
          
              if (result.hasResolution()) {
                  try {
                      result.startResolutionForResult(activity, requestCode);
                      return true;
                  } catch (IntentSender.SendIntentException e) {
                      // The intent was canceled before it was sent.  Return to the default
                      // state and attempt to connect to get an updated ConnectionResult.
                      client.connect();
                      return false;
                  }
              } else {
                  // not resolvable... so show an error message
                  int errorCode = result.getErrorCode();
                  Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode,
                          activity, requestCode);
                  if (dialog != null) {
                      dialog.show();
                  } else {
                      // no built-in dialog: show the fallback error message
                      showAlert(activity, fallbackErrorMessage);
                  }
                  return false;
              }
          }
          

          【讨论】:

            【解决方案7】:

            如果您不使用调试密钥,请将应用程序推送到 google play 作为 alpha 版,将自己添加为测试人员,最重要的是 - 点击 Aplha 页面上的“选择加入”链接并确认您是测试人员。

            【讨论】:

              【解决方案8】:

              我想分享一下我的经验。我的案例是在使用 Google Play 服务进行 Google Play 游戏时。我也收到 onConnectionFailed 给出 SIGN_IN_REQUIRED 错误。最后我意识到我没有在开发者控制台中“发布”我的游戏设置。不要误认为发布了您的 apk 的“alpha”或“beta”版本。我是指您创建并链接到游戏 APK 的实际 Google Play 游戏“游戏”。

              【讨论】:

                【解决方案9】:

                我有同样的问题并用这个解决方案解决了, 我实际上有非常旧版本的 google play-services 库,所以我用最新的 google play-service 库对其进行了更新,以便从我的 compile 'com.google.android.gms:play-services:11.0.4'以前的版本库来支持您的 android SDK 并在 gradle:app 中维护 compileSDKVersion 和 targetSDKVersion。 在清单中添加启用谷歌驱动的 API_KEY。然后重试

                【讨论】:

                  【解决方案10】:

                  在我的情况下,问题是在敏感范围内添加但未验证:

                  https://console.developers.google.com/apis/credentials 凭据 -> OAuth 同意屏幕 -> Google API 的范围

                  确保您没有未经验证的范围。

                  【讨论】:

                    【解决方案11】:

                    由于我的原因,我错误地使用了发布 SHA1 密钥在开发者控制台中生成 API。 然后使用 debug.keystore 创建 SHA1 密钥并在我的 api 凭据中更新。 它开始工作了。

                    keytool -list -v -keystore "C:\Users\<user>n\.android\debug.keystore" -alias androiddebugkey -storepass andro
                    id -keypass android
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-08-21
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-03-27
                      • 2014-07-14
                      相关资源
                      最近更新 更多