Как запустить определенную активность из приглашения GooglePlayGames

Я пытаюсь создать новое приложение для Android, состоящее из нескольких мини-игр. Активность запуска расширяет BaseGameActivity и имеет кнопку входа и ListView, содержащий все возможные игры, в которые можно играть.

Внутри активности мини-игры (также расширяющей BaseGameActivity), как я могу заставить ее создать уведомление, которое запустит определенное действие? В настоящее время, когда я вызываю инвайтплейерстогейм, отправляется приглашение для всего приложения (мини-игры), а не для отдельной игры (конкретная игра в кости).

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

Есть ли способ заставить уведомление генерироваться с конкретным сообщением? Есть ли способ получить уведомление, чтобы открыть непосредственно действие мини-игры, не переходя сначала к основному действию запуска?

Любая помощь приветствуется. Спасибо!


person thePatmanMI    schedule 24.08.2014    source источник
comment
Я тоже пытаюсь понять это для своей игры. Обновлю это, если я что-то найду. Интересно, что нигде нет документации по этому поводу, хотя в документации по играм от Google конкретно говорится, что при ответе на приглашение пользователь должен быть направлен непосредственно в игру, а не в меню. Это означало бы, что есть способ заставить начать определенную деятельность.   -  person Mobile Developer    schedule 08.10.2014
comment
Я думаю, вам, возможно, потребуется создать отдельную игру для каждой мини-игры в консоли разработчиков Google Play.   -  person LairdPleng    schedule 28.08.2015


Ответы (1)


Вы можете отправить 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:
   ....
person Mete    schedule 01.09.2016