Android实时多人游戏 - 房间创建失败

时间:2016-02-21 01:32:55

标签: android google-play-games multiplayer libjingle

我正在为我的应用使用Android Play Games - Real Time Multiplayer。当我创建一个新房间时,回调onRoomCreated()会在5%的时间内返回STATUS_NETWORK_ERROR_NO_DATA。我不知道为什么我偶然发现这个错误。

在创建新帖之前,应关闭一些帖子建议。我总是在super.onstop()被叫之前离开我的房间。在创建新房间之前,我还等待回调onLeftRoom()

栈跟踪

02-20 22:57:07.208: I/libjingle(1763): Token type:OAuth2
02-20 22:57:07.208: I/libjingle(1763): Final XMPP server hostname talk.google.com port to 5222
02-20 22:57:07.316: I/libjingle(1763): OpenSSLAdapter::OnConnectEvent
02-20 22:57:07.416: I/libjingle(1763): BeginSSL: talk.google.com
02-20 22:57:07.476: W/libjingle(1763): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-20 22:57:07.480: W/libjingle(1763): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-20 22:57:07.504: I/libjingle(1763): SSL Cleanup
02-20 22:57:07.532: I/libjingle(1763): Token type:OAuth2
02-20 22:57:07.532: I/libjingle(1763): Final XMPP server hostname talk.google.com port to 5222
02-20 22:57:07.596: I/libjingle(1763): OpenSSLAdapter::OnConnectEvent
02-20 22:57:07.692: I/libjingle(1763): BeginSSL: talk.google.com
02-20 22:57:07.752: W/libjingle(1763): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-20 22:57:07.752: W/libjingle(1763): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-20 22:57:07.764: D/MMC(5796): error onRoomCreated status: STATUS_NETWORK_ERROR_NO_DATA
02-20 22:57:07.796: I/libjingle(1763): SSL Cleanup
02-20 22:57:07.812: D/ChimeraCfgMgr(721): Loading module com.google.android.gms.games from APK com.google.android.play.games
02-20 22:57:07.812: D/ChimeraModuleLdr(721): Module APK com.google.android.play.games already loaded
02-20 22:57:08.520: D/dalvikvm(5796): GC_CONCURRENT freed 1059K, 23% free 8651K/11143K, paused 16ms+1ms, total 42ms
02-20 22:57:12.948: D/dalvikvm(485): GC_CONCURRENT freed 384K, 23% free 5746K/7367K, paused 7ms+1ms, total 18ms
02-20 22:57:24.932: I/Ads(5796): Ad is not visible. Not refreshing ad.
02-20 22:57:24.932: I/Ads(5796): Scheduling ad refresh 60000 milliseconds from now.
02-20 22:57:53.660: D/dalvikvm(5796): GC_CONCURRENT freed 1257K, 25% free 8434K/11143K, paused 22ms+1ms, total 38ms
02-20 22:57:57.044: I/ClearcutLoggerApiImpl(532): disconnect managed GoogleApiClient
02-20 22:57:58.960: I/GLSUser(5709): GLS error: BadAuthentication 123456789 oauth2:https://www.googleapis.com/auth/games
02-20 22:57:58.960: V/GoogleLoginService(5709): Returning error intent with: ComponentInfo{com.google.android.gsf.login/com.google.android.gsf.login.LoginActivity}
02-20 22:57:59.008: W/PlayEventLogger(721): deferring log upload because couldn't retrieve auth token

有谁知道我为什么会收到这个错误? 我很感谢每个提示

修改

我正在从主菜单活动开始新的游戏活动。当游戏结束时,我正在关闭房间,然后我返回主菜单活动。

以下是游戏活动的摘录:

private GoogleApiClient mGoogleApiClient;
private String mRoomId;
private final static int RC_WAITING_ROOM = 10002;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_multiplayer);
    // 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();
}

private void startQuickGame() {
    Log.d("MMC", "debug startgame()");
    // auto-match criteria to invite one random automatch opponent.
    // You can also specify more opponents (up to 3).
    Bundle am = RoomConfig.createAutoMatchCriteria(2, 6, 0);

    // build the room config:
    RoomConfig.Builder roomConfigBuilder = makeBasicRoomConfigBuilder();
    roomConfigBuilder.setAutoMatchCriteria(am);
    RoomConfig roomConfig = roomConfigBuilder.build();

    // create room:
    Games.RealTimeMultiplayer.create(mGoogleApiClient, roomConfig);

    // prevent screen from sleeping during handshake
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    // go to game screen
}

// create a RoomConfigBuilder that's appropriate for your implementation
private RoomConfig.Builder makeBasicRoomConfigBuilder() {
    Log.d("MMC", "debug makeBasicRoomConfigBuilder()");
    return RoomConfig.builder(this)
        .setMessageReceivedListener(this)
        .setRoomStatusUpdateListener(this);
}


@Override
public void onRoomCreated(int statusCode, Room room) {
    Log.d("MMC", "debug onRoomCreated status:" + statusCode);
    if (statusCode != GamesStatusCodes.STATUS_OK) {
        // let screen go to sleep
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        return;
        // show error message, return to main screen.
    }
    mRoomId = room.getRoomId();
    // get waiting room intent
    Intent i = Games.RealTimeMultiplayer.getWaitingRoomIntent(mGoogleApiClient, room, Integer.MAX_VALUE);
    startActivityForResult(i, RC_WAITING_ROOM);
}

@Override
public void onRoomConnected(int statusCode, Room room) {
    Log.d("MMC", "debug onRoomConnected status:" + statusCode);
    if (statusCode != GamesStatusCodes.STATUS_OK) {
        Log.d("MMC", "debug onRoomConnected error");
        // let screen go to sleep
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        // show error message, return to main screen.
    }
}

boolean mPlaying = false;

// at least 2 players required for our game
final static int MIN_PLAYERS = 2;

@Override
public void onActivityResult(int request, int response, Intent intent) {
    Log.d("MMC", "debug onActivityResult()");
    if (request == RC_WAITING_ROOM) {
        if (response == Activity.RESULT_OK) {
            // (start game)         
        }
        else if (response == Activity.RESULT_CANCELED) {
            // in this example, we take the simple approach and just leave the room:
            Games.RealTimeMultiplayer.leave(mGoogleApiClient, this, mRoomId);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
        else if (response == GamesActivityResultCodes.RESULT_LEFT_ROOM) {
            // player wants to leave the room.
            Games.RealTimeMultiplayer.leave(mGoogleApiClient, this, mRoomId);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    }
}

@Override
public void onDisconnectedFromRoom(Room room) {
    Log.d("MMC", "debug onDisconnectedFromRoom()");
    // leave the room
    Games.RealTimeMultiplayer.leave(mGoogleApiClient, this, mRoomId);

    // clear the flag that keeps the screen on
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    // show error message and return to main screen
}

@Override
public void onLeftRoom(int arg0, String arg1) {
    Log.d("MMC", "debug onLeftRoom() code:" + arg0);
    if(arg1!=null)
        Log.d("MMC", "debug roomId:" + arg1);
    if(!isFinishing())
        finish();       
}

@Override
public void onConnectedToRoom(Room arg0) {
    Log.d("MMC", "debug onConnectedToRoom()");
    Toast.makeText(this, "debug onConnectedToRoom", Toast.LENGTH_SHORT).show();         

}

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub
    Log.d("MMC", "debug onConnected()");
    startQuickGame();
}

@Override
public void onStart() {
    Log.d("MMC", "debug onStart()");
    mGoogleApiClient.connect();
    super.onStart();
}

@Override
public void onStop() {
    Log.d("MMC", "debug onStop()");
    // if we're in a room, leave it.
    leave();
    mGoogleApiClient.disconnect();
    super.onStop();
  }

private void leave(){
    Log.d("MMC", "debug leave()");
    Games.RealTimeMultiplayer.leave(mGoogleApiClient, this, mRoomId);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

编辑2:

我收到了与googles示例应用程序ButtonClicker2000相同的错误。这是stacktrace: [onRoomCreated(4,null)== NETWORK ERROR]

02-27 10:55:44.343: W/libjingle(1626): Warning(callregistry.cpp:27): void games_rtmp::CallRegistry::UnregisterCall(const string&, const string&): Attempting to erase non-existent session:1153730894
02-27 10:55:44.343: I/libjingle(1626): worker_thread:0xb7bdd4e0 initialized=1
02-27 10:55:44.355: I/libjingle(1626): Channel disabled
02-27 10:55:44.355: I/libjingle(1626): Changing data state, recv=0 send=0
02-27 10:55:44.363: I/libjingle(1626): Destroyed channel
02-27 10:55:44.383: V/GLSActivity(537): AuthDelegateWrapperCreated with selected intent: Intent { cmp=com.google.android.gms/.auth.DefaultAuthDelegateService }
02-27 10:55:44.391: V/GLSActivity(537): AuthDelegateWrapperCreated with selected intent: Intent { cmp=com.google.android.gms/.auth.DefaultAuthDelegateService }
02-27 10:55:44.719: I/libjingle(1626): Parsing Jingle data content
02-27 10:55:44.719: I/libjingle(1626): void gtalk::LibjingleClient::OnCallCreate(cricket::Call*): Connecting to OnAddSession
02-27 10:55:44.719: I/libjingle(1626): Calling Call::IncomingSession()
02-27 10:55:44.719: I/libjingle(1626): AddSession() called. has_data = 1
02-27 10:55:44.719: I/libjingle(1626): Creating data channel.
02-27 10:55:44.719: I/libjingle(1626): Is worker current:0
02-27 10:55:44.719: I/libjingle(1626): Current thread:0xb7c3f920
02-27 10:55:44.719: I/libjingle(1626): worker_thread:0xb7bdd4e0 initialized=1
02-27 10:55:44.719: I/libjingle(1626): Created channel for data
02-27 10:55:44.719: I/libjingle(1626): DataChannel::Init() called
02-27 10:55:44.719: I/libjingle(1626): Setting remote data description
02-27 10:55:44.719: I/libjingle(1626): Added data recv stream '' with ssrc=3755036348
02-27 10:55:44.719: I/libjingle(1626): Add remote ssrc: 3755036348
02-27 10:55:44.719: I/libjingle(1626): DataMediaChannel::SetSendBandwidth to 10485000bps.
02-27 10:55:44.719: I/libjingle(1626): Changing data state, recv=0 send=0
02-27 10:55:44.719: I/libjingle(1626): result = 1
02-27 10:55:44.719: I/libjingle(1626): void gtalk::LibjingleClient::OnAddSession(cricket::Call*, cricket::Session*): OnAddSession called.
02-27 10:55:44.723: I/libjingle(1626): Setting local data description
02-27 10:55:44.723: I/libjingle(1626): Added data send stream '' with ssrc=2649333871
02-27 10:55:44.723: I/libjingle(1626): Add send ssrc: 2649333871
02-27 10:55:44.723: I/libjingle(1626): SRTP reset to init state
02-27 10:55:44.723: I/libjingle(1626): Changing data state, recv=0 send=0
02-27 10:55:44.731: E/libjingle(1626): Error(latencyprober.cpp:83): Peer already added for reliable latency metrics.
02-27 10:55:44.731: I/libjingle(1626): Channel enabled
02-27 10:55:44.731: I/libjingle(1626): Changing data state, recv=1 send=0
02-27 10:55:44.735: I/libjingle(1626): Network Information: All networks
02-27 10:55:44.735: I/libjingle(1626): Name, Description, Prefix, Prefix Length, IP, ignored
02-27 10:55:44.735: I/libjingle(1626): ipv4-default default IPV4 network 0.0.0.0 32 10.0.3.15 0
02-27 10:55:44.735: I/libjingle(1626): eth0 eth0 192.168.169.0 24 192.168.169.101 0
02-27 10:55:44.735: I/libjingle(1626): eth1 eth1 10.0.3.0 24 10.0.3.15 0
02-27 10:55:44.735: I/libjingle(1626): eth0 eth0 fe80:: 64 fe80::a00:27ff:feff:300e 0
02-27 10:55:44.735: I/libjingle(1626): eth1 eth1 fe80:: 64 fe80::a00:27ff:fe12:f895 0
02-27 10:55:44.735: I/libjingle(1626): HttpRequest start: relay.google.com/create_session?username=s%2fLrJfwdW0xfJRKz&password=gdqF%2fWLjK3W2AZA18pjyiIj3&sn=3
02-27 10:55:44.735: I/libjingle(1626): SSL Cleanup
02-27 10:55:44.739: E/libjingle(1626): Error(basicpacketsocketfactory.cc:67): UDP bind failed with error 22
02-27 10:55:44.743: E/libjingle(1626): Error(basicpacketsocketfactory.cc:67): UDP bind failed with error 22
02-27 10:55:44.751: E/libjingle(1626): Error(basicpacketsocketfactory.cc:67): UDP bind failed with error 22
02-27 10:55:44.755: E/libjingle(1626): Error(basicpacketsocketfactory.cc:67): UDP bind failed with error 22
02-27 10:55:44.767: I/libjingle(1626): OpenSSLAdapter::OnConnectEvent
02-27 10:55:44.767: I/libjingle(1626): BeginSSL: relay.google.com
02-27 10:55:44.843: D/ButtonClicker2000(1573): onLeftRoom, code 0
02-27 10:55:44.847: I/libjingle(1626): virtual int games_rtmp::BuzzSubscriptionsTask::SetOnDisconnectTask::ProcessStart(): Send-on-disconnect: <cli:message to="games@ob.talk.google.com" type="headline" xmlns:cli="jabber:client"><push xmlns="google:push" channel="games.google.com/buzzbot" sendOnDisconnect="true"><recipient to="play-presence@games.bot.talk.google.com" remove="true"/></push></cli:message>
02-27 10:55:44.855: W/libjingle(1626): Warning(libjingleclient.cpp:1175): void gtalk::LibjingleClient::TerminateAllCalls_w(): Terminating call for session:425669904
02-27 10:55:44.867: W/libjingle(1626): Warning(callregistry.cpp:27): void games_rtmp::CallRegistry::UnregisterCall(const string&, const string&): Attempting to erase non-existent session:425669904
02-27 10:55:44.867: I/libjingle(1626): worker_thread:0xb7bdd4e0 initialized=1
02-27 10:55:44.867: I/libjingle(1626): Channel disabled
02-27 10:55:44.867: I/libjingle(1626): Changing data state, recv=0 send=0
02-27 10:55:44.871: I/libjingle(1626): HttpRequest cancelled
02-27 10:55:44.871: I/libjingle(1626): SSL Cleanup
02-27 10:55:44.871: I/libjingle(1626): SSL Cleanup
02-27 10:55:44.871: I/libjingle(1626): Destroyed channel
02-27 10:55:44.875: I/libjingle(1626): worker_thread:0xb7bdd4e0 initialized=1
02-27 10:55:44.875: I/libjingle(1626): SSL Cleanup
02-27 10:55:44.987: D/dalvikvm(735): GC_CONCURRENT freed 1707K, 13% free 13343K/15303K, paused 14ms+1ms, total 165ms
02-27 10:55:50.007: W/genymotion_audio(133): out_write() limiting sleep time 46802 to 39909
02-27 10:55:50.019: V/GLSActivity(537): AuthDelegateWrapperCreated with selected intent: Intent { cmp=com.google.android.gms/.auth.DefaultAuthDelegateService }
02-27 10:55:50.019: V/GLSActivity(537): AuthDelegateWrapperCreated with selected intent: Intent { cmp=com.google.android.gms/.auth.DefaultAuthDelegateService }
02-27 10:55:50.267: D/dalvikvm(537): GC_CONCURRENT freed 927K, 11% free 10835K/12039K, paused 13ms+7ms, total 41ms
02-27 10:55:50.639: I/libjingle(1626): Token type:OAuth2
02-27 10:55:50.639: I/libjingle(1626): Final XMPP server hostname talk.google.com port to 5222
02-27 10:55:50.683: D/dalvikvm(277): GC_CONCURRENT freed 954K, 10% free 12351K/13703K, paused 14ms+1ms, total 79ms
02-27 10:55:50.723: I/libjingle(1626): OpenSSLAdapter::OnConnectEvent
02-27 10:55:50.779: I/libjingle(1626): BeginSSL: talk.google.com
02-27 10:55:50.811: W/libjingle(1626): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-27 10:55:50.811: W/libjingle(1626): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-27 10:55:50.827: I/libjingle(1626): Token type:OAuth2
02-27 10:55:50.827: I/libjingle(1626): Final XMPP server hostname talk.google.com port to 5222
02-27 10:55:50.831: I/libjingle(1626): SSL Cleanup
02-27 10:55:50.863: I/libjingle(1626): OpenSSLAdapter::OnConnectEvent
02-27 10:55:50.915: I/libjingle(1626): BeginSSL: talk.google.com
02-27 10:55:50.943: W/libjingle(1626): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-27 10:55:50.943: W/libjingle(1626): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-27 10:55:50.943: D/ButtonClicker2000(1573): onRoomCreated(4, null)
02-27 10:55:50.943: E/ButtonClicker2000(1573): *** Error: onRoomCreated, status 4
02-27 10:55:50.951: D/dalvikvm(735): WAIT_FOR_CONCURRENT_GC blocked 0ms
02-27 10:55:50.955: I/libjingle(1626): SSL Cleanup
02-27 10:55:50.995: D/dalvikvm(735): GC_EXPLICIT freed 239K, 14% free 13186K/15303K, paused 2ms+1ms, total 45ms
02-27 10:55:51.011: D/ChimeraCfgMgr(735): Loading module com.google.android.gms.games from APK com.google.android.play.games
02-27 10:55:51.011: D/ChimeraModuleLdr(735): Module APK com.google.android.play.games already loaded
02-27 10:55:53.243: I/libjingle(1626): Token type:OAuth2
02-27 10:55:53.243: I/libjingle(1626): Final XMPP server hostname talk.google.com port to 5222
02-27 10:55:53.275: I/libjingle(1626): OpenSSLAdapter::OnConnectEvent
02-27 10:55:53.327: I/libjingle(1626): BeginSSL: talk.google.com
02-27 10:55:53.351: W/libjingle(1626): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-27 10:55:53.351: W/libjingle(1626): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-27 10:55:53.363: I/libjingle(1626): SSL Cleanup
02-27 10:55:53.371: I/libjingle(1626): Token type:OAuth2
02-27 10:55:53.371: I/libjingle(1626): Final XMPP server hostname talk.google.com port to 5222
02-27 10:55:53.403: I/libjingle(1626): OpenSSLAdapter::OnConnectEvent
02-27 10:55:53.459: I/libjingle(1626): BeginSSL: talk.google.com
02-27 10:55:53.487: W/libjingle(1626): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-27 10:55:53.487: W/libjingle(1626): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-27 10:55:53.487: D/ButtonClicker2000(1573): onRoomCreated(4, null)
02-27 10:55:53.487: E/ButtonClicker2000(1573): *** Error: onRoomCreated, status 4
02-27 10:55:53.495: D/ChimeraCfgMgr(735): Loading module com.google.android.gms.games from APK com.google.android.play.games
02-27 10:55:53.495: D/ChimeraModuleLdr(735): Module APK com.google.android.play.games already loaded
02-27 10:55:53.515: I/libjingle(1626): SSL Cleanup
02-27 10:55:59.319: I/GLSUser(848): GLS error: BadAuthentication 191152222268 oauth2:https://www.googleapis.com/auth/games
02-27 10:55:59.319: V/GoogleLoginService(848): Returning error intent with: ComponentInfo{com.google.android.gsf.login/com.google.android.gsf.login.LoginActivity}
02-27 10:55:59.331: W/PlayEventLogger(735): deferring log upload because couldn't retrieve auth token
02-27 10:55:59.343: D/SizeAdaptiveLayout(399): com.android.internal.widget.SizeAdaptiveLayout@53a619b8child view android.widget.FrameLayout@53a6290c measured out of bounds at 95px clamped to 96px

1 个答案:

答案 0 :(得分:1)

你的清单......我希望它会帮助你

1.检查您是否添加了测试帐户

2.检查您是否在游戏的Google Play开发者控制台中启用了实时多人游戏。

3.在androidMainfest文件中检查所需的元标记