onConnectionFailed给出SIGN_IN_REQUIRED(4)

时间:2014-05-19 11:04:55

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

我正在开发一个Android应用程序,我想使用Google API。为此,我导入了 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)我的活动实现了 ConnectionCallbacks OnConnectionFailedListener。

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控制台中创建了该项目。

11 个答案:

答案 0 :(得分:23)

我遇到了同样的问题。

来自文档: 客户端可以选择在不使用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;
}

答案 1 :(得分:7)

只需关注谷歌的instructionss

即可

AND 注意

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

应该从控制台页面启用Drive api。

答案 5 :(得分:3)

不确定这是否是最佳答案,但它对我有用。我从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;
    }
}

答案 6 :(得分:2)

如果您没有使用调试密钥,请将app推送到Google Play作为alpha,将自己添加为测试人员并且最重要 - 请按照"选择加入"链接Aplha页面并确认你是测试人员。

答案 7 :(得分:1)

我想与此分享我的经验。我的情况是将Google Play服务用于Google Play游戏。我也得到onConnectionFailed给出SIGN_IN_REQUIRED错误。最后我意识到我没有"发布"我在开发者控制台中的游戏设置。不要误以为发布" alpha"或" beta"你的apk版本。我指的是实际的Google Play游戏" Game"你创建并链接到游戏的APK。

答案 8 :(得分:1)

我有同样的问题并用这个解决方案解决了, 我实际上有一个非常旧版本的谷歌播放服务库,所以我用最新的谷歌播放服务库更新它到编译'com.google.android.gms:播放服务:11.0.4'从我的以前的版本库支持你的android SDK并在gradle:app中维护compileSDKVersion和targetSDKVersion。 在manifest中添加启用了google驱动器的API_KEY,然后重试

答案 9 :(得分:1)

在我的情况下,问题出在敏感范围内,尚未验证:

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

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

答案 10 :(得分:0)

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

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