java - 如何从 GooglePlayGames 邀请启动特定 Activity

标签 java android google-play-games

我正在尝试创建一个由多个迷你游戏组成的新 Android 应用程序。启动器 Activity 扩展了 BaseGameActivity,并有一个登录按钮和一个包含所有可以玩的游戏的 ListView。

在迷你游戏 Activity (也扩展了 BaseGameActivity)中,我怎样才能让它创建一个将启动特定 Activity 的通知?目前,当我调用 invitePlayersToGame 时,发送的邀请是针对整个应用程序(迷你游戏)而不是单个游戏(特定的骰子游戏)。

public void invitePlayersToGame(View pView) {
    Intent intent = Games.RealTimeMultiplayer.getSelectOpponentsIntent(getApiClient(), 1, 1);
    intent.putExtra("gameName", "Patman Yahtzee");
    startActivityForResult(intent, RC_SELECT_PLAYERS);
}

有没有办法让通知生成特定的消息?有没有办法让通知直接打开迷你游戏 Activity ,而无需先进入主启动器 Activity ?

感谢任何帮助。谢谢!

最佳答案

您可以发送sendReliableMessage用于方法握手。

首先进入一个房间(快速游戏或发送邀请)。

public void openInvitationIntent() {
    // launch the player selection screen
    // minimum: 1 other player; maximum: 1 other players
    Intent intent = Games.RealTimeMultiplayer.getSelectOpponentsIntent(mGoogleApiClient, 1, 1);
    startActivityForResult(intent, RC_SELECT_PLAYERS);
}

已连接:

   @Override
public void onConnected(Bundle connectionHint) {
    // QuickGame
    if (mGameMode == 1) {
        Log.d(TAG, "onConnected() called. Sign in successful!");
        Log.d(TAG, "Sign-in succeeded.");
        startQuickGame();

        // register listener so we are notified if we receive an invitation to play
        // while we are in the game
        if (connectionHint != null) {
            Log.d(TAG, "onConnected: connection hint provided. Checking for invite.");
            Invitation inv = connectionHint.getParcelable(Multiplayer.EXTRA_INVITATION);
            if (inv != null && inv.getInvitationId() != null) {
                // retrieve and cache the invitation ID
                Log.d(TAG, "onConnected: connection hint has a room invite!");
                acceptInviteToRoom(inv.getInvitationId());
                return;
            }
        }
    }
    // Send request
    else if (mGameMode == 0) {
        // request code for the "select players" UI
        // can be any number as long as it's unique
        invitationInbox();
    }
    // request accepted
    else {
        mIncomingInvitationId = getIntent().getExtras().getString(AppConstants.RC_INVITATION_ID);
        RoomConfig.Builder roomConfigBuilder = makeBasicRoomConfigBuilder();
        roomConfigBuilder.setInvitationIdToAccept(mIncomingInvitationId);
        Games.RealTimeMultiplayer.join(mGoogleApiClient, roomConfigBuilder.build());

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

在此之后,您可以发送模型类(包括您需要的)。

 private void broadcastMessage(ModelGameRecievedMessage broadcastedMessage, boolean isFinal) {
    try {
        if ( mParticipants != null && broadcastedMessage != null) {
            byte[] bytes = Utils.serialize(broadcastedMessage);
            // Send to every other participant.
            for (Participant p : mParticipants) {
                if (p.getParticipantId().equals(mMyId)) {
                    continue;
                }
                if (p.getStatus() != Participant.STATUS_JOINED) {
                    continue;
                }
                if (mRoomId != null) {
                    if (isFinal) {
                        // final score notification must be sent via reliable broadcastedMessage
                        Games.RealTimeMultiplayer.sendReliableMessage(mGoogleApiClient, null, bytes,
                                mRoomId, p.getParticipantId());
                    } else {
                        // it's an interim score notification, so we can use unreliable
                        Games.RealTimeMultiplayer.sendUnreliableMessage(mGoogleApiClient, bytes,
                                mRoomId, p.getParticipantId());
                    }
                }
            }
            Logy.l("broadcastedMessage.getMessageTypeId(); " + broadcastedMessage.getMessageTypeId());
            Logy.l("broadcastedMessage.getMessage(); " + broadcastedMessage.getMessage());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

终于可以访问其他设备上的数据了:

 @Override
public void onRealTimeMessageReceived(RealTimeMessage rtm) {

    byte[] bufy = rtm.getMessageData();
    ModelGameRecievedMessage recievedMessage = null;
    try {
        recievedMessage = (ModelGameRecievedMessage) Utils.deserialize(bufy);
        Logy.l("recievedMessage.getMessageTypeId(); " + recievedMessage.getMessageTypeId());
        Logy.l("recievedMessage.getMessage(); " + recievedMessage.getMessage());
    } catch (Exception e) {
        Logy.e("Exception onRealTimeMessageReceived deserialize:  " + e);
    }
    switch (recievedMessage.getMessageTypeId()) {
        case AppConstants.RC_MULTI_START_TIMEMILIS_MULTIPLAYER:
   ....

关于java - 如何从 GooglePlayGames 邀请启动特定 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467704/

相关文章:

javascript - 在手机 block 屏幕上显示音频元数据?

android - 我如何在 TurnBasedMatch 中获得自己的参与者 ID?

android - 列出 Google Play 游戏服务中的所有排行榜

android - 如何从 Google Play 服务通知中检测 Intent

java - Jfreechart 可以实现多线程吗?

java - 如何将 AbstractContextLoaderInitializer 包含到我的 mvc 测试执行中?

java - Android - 代码覆盖率测试错误

java - 为什么 SSL 在构建 jar 中不起作用?

android - 在 android 中处理 SpannableStringBuilder 图像

android - 当我在函数中使用它时,音频文件不播放