未调用 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 游戏服务