Failed to sign in. Please check your network conne

2019-01-09 11:04发布

问题:

I am trying to make simple game with Google Play Games Services, but I failed to sign in to Google Play Games.

I get this error:

Failed to sign in. Please check your network connection and try again.

I have MainActivity, and three fragmenets (MainFragment, GameFragment and ResultFragment).

MainFragment is fragment for main menu, where use have button to click to start the game.

Authorization?

I have linked and authorized my game with SHA-1 in Google Play Developer Console.

As I use Android Studio my package name looks something like: aplikacijezaandroid.thebuttonchallenge, and I added two app version in linked apps on Google Play Developer Console.

So I have com.aplikacijezaandroid.thebuttonchallenge, and aplikacijezaandorid.thebuttonchallenge

App ID?

I added app id, and leaderboard id into strings.xml and I added meta tag to Android Manifest.

I have added Internet permission in AndroidManifest.xml

Testing?

I test and debug app from Android Studio with physical device and ofc there is my own gmail added as test user in Google Play Developer Console.

Here is my AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="aplikacijezaandroid.thebuttonchallenge" >

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
   <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id"/>
   <meta-data android:name="com.google.android.gms.version" 

  android:value="@integer/google_play_services_version"/>
  </application>

Here is MainActivity class:

 public class MainActivity extends Activity implements MainMenuFragment.Listener,   
 GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, 
 GameFragment.Listener, ResultFragment.Listener {

//Fragments
MainMenuFragment mMainFragment;
GameFragment mGameFragment;
ResultFragment mResultFragment;

// Client used to interact with Google APIs
private GoogleApiClient mGoogleApiClient;

// Are we currently resolving a connection failure?
private boolean mResolvingConnectionFailure = false;

// Has the user clicked the sign-in button?
private boolean mSignInClicked = false;

// Automatically start the sign-in flow when the Activity starts
private boolean mAutoStartSignInFlow = true;

// request codes we use when invoking an external activity
private static final int RC_RESOLVE = 5000;
private static final int RC_UNUSED = 5001;
private static final int RC_SIGN_IN = 9001;

//Debug
private String TAG = "IGRA";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Create the Google API Client with access to Plus and Games
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Plus.API).addScope(Plus.SCOPE_PLUS_LOGIN)
            .addApi(Games.API).addScope(Games.SCOPE_GAMES)
            .build();

    //Fragments
    mMainFragment = new MainMenuFragment();
    mGameFragment = new GameFragment();
    mResultFragment = new ResultFragment();

    // listen to fragment events
    mMainFragment.setListener(this);
    mGameFragment.setListener(this);
    mResultFragment.setListener(this);

    //Treba dodati listenere


    // add initial fragment (welcome fragment)
    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction().add(R.id.container, mMainFragment).commit();
    }
}

// Switch UI to the given fragment
void switchToFragment(Fragment newFrag) {
    getFragmentManager().beginTransaction().replace(R.id.container, newFrag)
            .commit();
}

private boolean isSignedIn() {
    return (mGoogleApiClient != null && mGoogleApiClient.isConnected());
}

@Override
protected void onStart() {
    super.onStart();
    Log.d(TAG, "onStart(): connecting");
    mGoogleApiClient.connect();
}

@Override
protected void onStop() {
    super.onStop();
    Log.d(TAG, "onStop(): disconnecting");
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

@Override
public void onStartGameRequested() {
    startGame();
}

@Override
public void onShowAchievementsRequested() {

}

@Override
public void onShowLeaderboardsRequested() {

}

void startGame(){
    switchToFragment(mGameFragment);
}

public void onEnteredScore(int finalScore){

    mResultFragment.setFinalScore(finalScore);

    // push those accomplishments to the cloud, if signed in
    pushAccomplishments(finalScore);

    // switch to the exciting "you won" screen
    switchToFragment(mResultFragment);
}

private void pushAccomplishments(int finalScore) {

    if (!isSignedIn()) {
        // can't push to the cloud, so save locally
       // mOutbox.saveLocal(this);
        Log.d(TAG, "can't push to the cloud, so save locally");
        return;
    }
    Games.Leaderboards.submitScore(mGoogleApiClient,   getString(R.string.number_guesses_leaderboard),
            finalScore);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onConnected(Bundle bundle) {
    Log.d(TAG, "onConnected(): connected to Google APIs");
    // Show sign-out button on main menu
    //mMainFragment.setShowSignInButton(false);

    // Show "you are signed in" message on win screen, with no sign in button.
    //mWinFragment.setShowSignInButton(false);

    // Set the greeting appropriately on main menu
    Player p = Games.Players.getCurrentPlayer(mGoogleApiClient);
    String displayName;
    if (p == null) {
        Log.w(TAG, "mGamesClient.getCurrentPlayer() is NULL!");
        displayName = "???";
    } else {
        displayName = p.getDisplayName();
    }
    mMainFragment.setGreeting("Hello, " + displayName);


    // if we have accomplishments to push, push them
    /*if (!mOutbox.isEmpty()) {
        pushAccomplishments();
        Toast.makeText(this, getString(R.string.your_progress_will_be_uploaded),
                Toast.LENGTH_LONG).show();
    }*/
}

@Override
public void onWinScreenDismissed() {
    switchToFragment(mMainFragment);
}

@Override
public void onWinScreenSignInClicked() {

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    if (requestCode == RC_SIGN_IN) {
        mSignInClicked = false;
        mResolvingConnectionFailure = false;
        if (resultCode == RESULT_OK) {
            mGoogleApiClient.connect();
        } else {
            BaseGameUtils.showActivityResultError(this, requestCode, resultCode,
                    R.string.signin_failure, R.string.signin_other_error);
        }
    }
}

@Override
public void onConnectionSuspended(int i) {
    Log.d(TAG, "onConnectionSuspended(): attempting to connect");
    mGoogleApiClient.connect();
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.d(TAG, "onConnectionFailed(): attempting to resolve");
    if (mResolvingConnectionFailure) {
        Log.d(TAG, "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;
        }
    }

    // Sign-in failed, so show sign-in button on main menu
    mMainFragment.setGreeting(getString(R.string.signed_out_greeting));
    //mMainMenuFragment.setShowSignInButton(true);
   // mWinFragment.setShowSignInButton(true);
}

回答1:

I have solved this problem, so I will post the answer.

I have moved app id and leaderboard id from strings.xml to ids.xml in values folder.

I have deleted all client ids and add again client ids for debug keystore and release keystore.



回答2:

In my case the problem was one of gmail accounts (out of two) was not added to the testers accounts at the play store and was the default account for my device.

I removed the account to make the other account (testers account at playstore) default and added it back again, and it started working



回答3:

If you haven't published your app/game: After you done every usual step, make sure you test your app/game with a device has only the test account/s. I checked every step a few times and ended with this weird problem. Lastly i tested my app with a device has only test account i added on Developer Console. It worked. Hope, this helps someone else.



回答4:

In my case.I setted one test account,but my device has an default account which is another,that's why I got this error.My mistake but Why can't google gives us an more obvious error report?

Here is how I worked this out.All my test was under debug version using test account. I delete the project, both in google play develper console and google Api console.And recreate one as mentioned by others on stackoverflow.But this does't help.I redo this and ends up in vane.

I cheked found in log these same words:

03-09 16:15:39.897: E/GameAgent(1225): Unable to retrieve application xxxxxxx from network 03-09 16:15:39.902: E/GameAgent(1225): Application ID xxxxxxx is not associated with package com.gyj.pub.gpgsDemo. Check the application ID in your manifest. 03-09 16:15:39.906: E/CheckGameplayAcl(23917): Unable to load metadata for game 03-09 16:15:39.906: W/SignInActivity(23917): onSignInFailed()...

one more,I checked all the 3 elements below ,decide whether the client apk is conform with Google Play Deverloper Console's configuration. 1.package name .It is all the same. 2.Certification SHA1 fingerprint.(debug and release). 3.test Account.

Even at that time I did not realize that I haven't input an account during my tests,How does the device know which account is attend to sign in? I tried an other account.I added this account which has setted in sonsole as Test Account to the device,relaughched the TypeANumber app.It showed me a view to choose one from the two accounts.Suddently I got it.



回答5:

In my case,I only add a release client ID in Google Play Console. When I run my app by click button RUN in AS,the network connection error show.But when I run the apk generated by the signed,it work well. So, add a debug client id if you want to run your app inside AS.



回答6:

For me its that my project SHA1 is not the same as what is in the API console.
1. I've checked mine through this.
2. Went to https://console.developers.google.com and into the "Credentials" page of my project.
3. Clicked on the edit button (the pencil icon) and pasted over the SHA1
4. Worked within <2 minutes