未调用 Google 游戏服务 onPeersDisconnected/onP2PDisconnected

Posted

技术标签:

【中文标题】未调用 Google 游戏服务 onPeersDisconnected/onP2PDisconnected【英文标题】:Google Game Services onPeersDisconnected/onP2PDisconnected not being called 【发布时间】:2013-09-02 05:32:30 【问题描述】:

如标题所示,我已经能够连接到 Google 游戏服务,在两台设备之间交换数据,一切正常,除了一件事:断开连接回调 .

我试图拦截 onPeersDisconnected 和 onP2PDisconnected 都没有成功。 onP2PDisconnected 方法在与 Internet 断开连接的设备中被调用,但在仍然在线的设备中没有被调用(因此无法告诉玩家另一个已断开连接)。

比赛开始后,似乎永远不会通知第二台设备意外断开连接。如果用户正确关闭游戏,则认为 onPeersLeft 方法会被调用。

两个设备之间的 ping 真的需要克服这个“错误”吗?我是不是做错了什么?

这是我使用的代码:

void startQuickGame() 
    // quick-start a game with 1 randomly selected opponent
    final int MIN_OPPONENTS = 1, MAX_OPPONENTS = 1;
    Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(MIN_OPPONENTS,
            MAX_OPPONENTS, 0);
    RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
    rtmConfigBuilder.setMessageReceivedListener(this);
    rtmConfigBuilder.setRoomStatusUpdateListener(this);
    rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
    mListener.switchToScreen(R.id.screen_wait);
    keepScreenOn();
    resetGameVars();
    getGamesClient().createRoom(rtmConfigBuilder.build());

这里是简单的听众:

@Override
public void onPeersDisconnected(Room room, List<String> peers) 
    Log.d(TAG, "onPeersDisconnected");
    updateRoom(room);


void updateRoom(Room room) 
    Log.d(TAG, "UpdateRoom: "+room.getParticipants().size());
    mParticipants = room.getParticipants();


@Override
public void onP2PDisconnected(String participantId) 
    Log.d(TAG,  "onP2PDisconnected");



public int getPartecipantsInRooom()
    if(mRoom != null)
        return mRoom.getParticipants().size();
    else
        return -123456;

请注意,在两个设备之一断开连接后调用 getPartecipantsInRooom() 始终返回 2,并且永远不会调用 updateRoom。

【问题讨论】:

回答我自己的问题我注意到 onP2PDisconnected 方法被调用,但在 60 多秒后!所以它有点没用......我将使用一些计时器,每 X 秒向其他设备发送 ping ......这样用户不必等待 60 多秒才能知道比赛无法继续. 您应该将其添加为答案并接受它,以帮助可能遇到相同问题的其他人。 【参考方案1】:

只是为了确保这可能对您不起作用,对于我的应用程序,我使用它来让我知道其他参与者何时离开房间,并立即调用它:

@Override
    public void onPeerLeft(Room room, final List<String> participantIds) 


        this.mRoomCurrent = room;
        this.mRoomId = this.mRoomCurrent.getRoomId();
        this.mParticipants = this.mRoomCurrent.getParticipants();

        int connected = 0;
        for (Participant p : room.getParticipants()) 
            if(p.getStatus() == Participant.STATUS_JOINED) 
                connected += 1;
            
        

        final int fconnected = connected;
        for (String s : listIgnoreTheseIDs) 
            //checkint to see if we care anymore about this ID.. if out of game already.. nope
            if(s.equals(participantIds.get(0)))
                return;
            
        
        Gdx.app.postRunnable(new Runnable() 
                @Override
                public void run() 
                    mGHInterface.onPeerLeft(fconnected, participantIds.size()); 
                
            );
        

不知道为什么会有两个项目,但和你一样,我意识到 onPeersDisconnected() 并不那么可靠,但 onPeerLeft() 通常会在 1 秒内返回到其他设备。

【讨论】:

【参考方案2】:

onPeerDisconnected() 处理断开连接。因此,如果有人仍在应用程序中但网络连接丢失,则会为他调用。

onPeerLeft() 处理离开房间的参与者。当有人 explizit 离开应用程序中的房间或应用程序被最小化,并且房间留在 androids 的 onStop() 或 onDestroy() 回调时,会调用此方法。

【讨论】:

【参考方案3】:

我正在制作两人游戏。所以我使用这种方法

@Override
public void onPeerLeft(Room room, List<String> peersWhoLeft) 
    updateRoom(room);
    Toast.makeText(MyLauncherActivity.this, "Other player left the game", Toast.LENGTH_LONG).show();
    quitGame();

【讨论】:

以上是关于未调用 Google 游戏服务 onPeersDisconnected/onP2PDisconnected的主要内容,如果未能解决你的问题,请参考以下文章

Google Play 游戏 - Activity 自动调用 beginUserInitiatedSignIn()

如何测试使用 google play 游戏服务的未发布的 android 游戏?

Unity 游戏未正确配置为使用 google play 游戏服务

等候室后未触发 onActivityResult(Google Play 游戏服务)

应用程序未正确配置为使用 google play 游戏服务

应用程序未正确配置为在 libgdx 游戏中使用 Google Play 服务