onConnectionFailed giving SIGN_IN_REQUIRED(4)

28,576

Solution 1

I had the same problem.

From documentation: The client may choose to continue without using the API or it may call startResolutionForResult(Activity, int) to prompt the user to sign in.

So you should try to sign in by using startResolutionForResult() function

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

   mConnectionResult = result;
}

Solution 2

Just follow google's instructionss

AND CAUTION

Since you are still in development mode, check if you have added your testing email address in the GAME DETAILS center before publishing the game.

Solution 3

Check that you are signing the app with a keystore that is in the apk uploaded to Google Play Developer's Console (if testing, you can upload as alpha and publish while keeping it private).

If not this, it could be other things. Make sure your account's email address is listed in testers in the Account details page (on the settings menu with a gear icon), and the licensed response is set to LICENSED, NOT to RESPOND_NORMALLY

Solution 4

Not sure if this is the best answer but it worked for me. I copied onConnectionFailed() from the BasicSamples TakeANumber MainActivity. It calls BaseGameUtils to resolve. Of course that implies you have the BaseGameUtils library included in your project and that's another can of worms. But maybe you can get by with the one method so I copied it below.

@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;
        }
    }
}

From 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;
    }
}

Solution 5

Drive api should be enabled from the console page.

Share:
28,576

Related videos on Youtube

DCoder
Author by

DCoder

Updated on March 25, 2020

Comments

  • DCoder
    DCoder about 4 years

    I am developing an Android application where I want to use the Google API. For that I have imported the google-play-service-lib project.

    I am following this link to initialize GoogleApiClient object.

    My code:

    1) In the onCreate() method I am building the GoogleApiClient object:

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

    2) In onStart(), I call mGoogleApiClient.connect().

    3) My activity implements ConnectionCallbacks and OnConnectionFailedListener.

    4) My onConnectionFailed() method looks like:

    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) My onActivityResult() method contains:

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

    When I run my app I get a Toast that says that an internal error popped up. I did create the project in the Google console.

  • Sharp Steel Software
    Sharp Steel Software almost 9 years
    If the sign in intent fails, why would you try to call mPlusClient.connect() inside the catch block? At that point, the user hasn't signed in so the call would necessarily fail again.
  • Rahul Rastogi
    Rahul Rastogi almost 9 years
    Doesn't work for me. After trying startResolutionForResult() my onConnected() calls and I receive the email But Person object is received null after trying to fetch this object.
  • nav_jan
    nav_jan about 8 years
    what is REQUEST_CODE_RESOLVE_ERR? I get unresolved symbol on REQUEST_CODE_RESOLVE_ERR.
  • Recomer
    Recomer almost 8 years
    @nav_jan it's a Request Code that they made up themselves. You can set yours easily private static int REQUEST_CODE_RESOLVE_ERR = 1000; or to any positive number you want. And than use it to check whether is that the write call that returns in your onActivityResult().
  • Silviu St
    Silviu St over 6 years
    The part that you must have added the google email that is in your device worked for me. It must be added Game Services -> Testing. Thanks
  • Philipp Cherubim
    Philipp Cherubim almost 5 years
    Thanks! Not adding the email to the testers email list was it all dough.