onConnectionFailed giving SIGN_IN_REQUIRED(4)
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.
Related videos on Youtube
DCoder
Updated on March 25, 2020Comments
-
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 callmGoogleApiClient.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 almost 9 yearsIf 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 almost 9 yearsDoesn'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 about 8 yearswhat is REQUEST_CODE_RESOLVE_ERR? I get unresolved symbol on REQUEST_CODE_RESOLVE_ERR.
-
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 over 6 yearsThe 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 almost 5 yearsThanks! Not adding the email to the testers email list was it all dough.