登录失败。请检查您的网络连接并重试。

9

我正在尝试使用Google Play游戏服务制作简单的游戏,但是我无法登录到Google Play游戏。

我收到了这个错误

登录失败。请检查您的网络连接并重试。

我有MainActivity和三个片段(MainFragment、GameFragment和ResultFragment)。

MainFragment是主菜单的片段,在那里用户有按钮可以点击来开始游戏。

授权?

我已经在Google Play开发者控制台中链接和授权了我的游戏的SHA-1。

由于我使用Android Studio,我的包名看起来像是:aplikacijezaandroid.thebuttonchallenge,并且我在Google Play开发者控制台上添加了两个应用程序版本。

因此,我有com.aplikacijezaandroid.thebuttonchallenge和aplikacijezaandorid.thebuttonchallenge。

应用程序ID?

我将应用程序ID和排行榜ID添加到strings.xml中,并将meta标签添加到Android清单中。

我在AndroidManifest.xml中添加了Internet权限。

测试?

我使用物理设备从Android Studio测试和调试应用程序,当然在Google Play开发者控制台中添加了自己的Gmail作为测试用户。

这是我的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>

这里是 MainActivity 类:

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

你的游戏已经发布了吗?还是处于alpha或beta测试阶段? - MadEqua
我还没有发布我的游戏,甚至没有将apk上传到Google Play开发者控制台。我只是将新游戏添加到游戏服务中,状态已准备好进行测试。 - Zookey
6个回答

5

我已经解决了这个问题,所以我会发布答案。

我把应用程序 ID 和排行榜 ID 从 strings.xml 移动到值文件夹中的 ids.xml。

我删除了所有客户端 ID,并为调试密钥库和发布密钥库再次添加了客户端 ID。


2
我遇到了同样的错误。我已经在ids.xml中拥有我的ID,但是你说删除了所有客户端ID并重新添加它们是什么意思?我尝试创建一个新的调试密钥库并设置一个新的OAuth,甚至是一个全新的游戏。但我仍然遇到这个奇怪的错误。 - Madmenyo

4
在我的情况下,问题出在我有两个gmail账户,其中一个没有被添加到play商店的测试人员账户中,并且是我的设备默认账户。
我删除了该账户,将另一个账户(play商店的测试人员账户)设为默认账户,然后重新添加该账户,问题就得到解决了。

4
如果您还没有发布您的应用/游戏:完成所有常规步骤后,请确保使用仅具有测试帐户/的设备测试您的应用/游戏。我多次检查了每个步骤,最终发现了这个奇怪的问题。最后,我使用了只有我在开发者控制台上添加的测试帐户的设备测试了我的应用程序。它起作用了。希望这能帮助其他人。

0
在我的情况下,我只在Google Play控制台中添加了一个发布客户端ID。当我通过AS中的RUN按钮运行我的应用程序时,会显示网络连接错误。但是当我运行由签名生成的apk时,它可以正常工作。因此,如果您想在AS内运行应用程序,请添加调试客户端ID。

0
在我的情况下,我设置了一个测试账户,但是我的设备有一个默认账户,这就是为什么我会得到这个错误。这是我的错误,但为什么谷歌不能给我们一个更明显的错误报告呢?
这是我解决问题的方法。所有的测试都是在调试版本中使用测试账户进行的。我删除了项目,在Google Play开发者控制台和Google API控制台中都删除了,并按照Stackoverflow上其他人提到的重新创建了一个。但这并没有帮助我解决问题。我重做了一遍,最终失败了。
我检查日志,发现了相同的错误信息:
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()...

再来一次,我检查了下面的3个元素,决定客户端apk是否符合Google Play开发者控制台的配置。 1.包名。都是一样的。 2.认证SHA1指纹(调试和发布)。 3.测试帐户。

即使在那时,我也没有意识到在我的测试中我没有输入一个帐户,设备怎么知道要登录哪个帐户? 我尝试了另一个帐户。我将这个已设置为测试帐户的帐户添加到设备上,重新启动了TypeANumber应用程序。它向我显示了一个视图,让我从两个帐户中选择一个。突然我明白了。


0

对我来说,我的项目SHA1与API控制台中的不同。
1. 我通过this检查了我的项目。
2. 进入我的项目的“凭据”页面https://console.developers.google.com
3. 点击编辑按钮(铅笔图标),并粘贴SHA1。
4. 在2分钟内解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接