Freigeben über


Erste Schritte mit Android

In diesem Dokument werden die grundlegenden Voraussetzungen und Anforderungen aufgeführt, die für die Integration von PlayFab Party in Ihre Android-Anwendungen erforderlich sind. Nachdem Sie Ihr System gemäß diesem Dokument eingerichtet haben, sehen Sie sich den Schnellstart für die PlayFab-Party an, um die Bausteine der PlayFab-Party einzurichten.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, stellen Sie sicher, dass die folgenden Voraussetzungen erfüllt sind:

  1. Sie haben ein PlayFab-Entwicklerkonto erstellt.

  2. Sie haben einen PlayFab-Titel erstellt, und Ihr Titel wurde für die PlayFab-Party zugelassen.

  3. Sie haben Android Studio Version 3.2 oder höher installiert.

  4. Ihre App ist auf Android 4.4 (Kitkat) oder höher ausgelegt.

  5. Sie haben android NDK 18.1.5063045 oder höher installiert.

  6. Sie haben Zugriff auf das PlayFab Party-Plattformrepository.

  7. Sie haben ein Android-Signaturzertifikat erstellt und Ihre App für die Bereitstellung mit der Zertifikatkonfiguration signiert.

Einschließen der erforderlichen Bibliotheken und Headerdateien

Sie müssen die folgenden Headerdateien aus dem PlayFab Party-Verteilungsrepository einschließen.

LIB-Dateien

  1. libParty.a
  2. libcrypto.a
  3. libssl.a

Notiz

Die SSL-Bibliotheken basieren auf Open SSL Version 1.1.1b-dev. Verwenden Sie eine openSSL-Version, die 1.1.1b-dev oder höher ist.

Header Includes

Partyheader

Notiz

Zusätzlich zu den oben genannten Lib-Dateien und Headern benötigen Sie auch die Libs und Header für das PlayFab SDK und alle anderen plattformspezifischen Abhängigkeiten, die Ihre App benötigt. Weitere Informationen finden Sie in der Projektdatei organization für das Android-Beispiel.

Schritte zum Ausführen der PlayFab-Party unter Android

Da die Kern-Partybibliothek mit C++ geschrieben wurde, müssen wir eine einfache JNI-Wrapperklasse erstellen, um auf die Party lib-Funktionalität zuzugreifen. Im Allgemeinen benötigen Sie eine Klasse, die Zugriff auf Party-API-Methoden hat, um ein Netzwerk zu erstellen, eine Verbindung mit einem Netzwerk herzustellen und Nachrichten über ein Netzwerk zu senden. Dies haben wir in unserer Demo-App über die Java-Klasse NetworkManager erreicht.


import android.util.Log;

public class NetworkManager {
    static {
        System.loadLibrary("partysample");
    }

    private MessageManager messageManager;

    private static NetworkManager networkManager;

    private NetworkManager() {
    }

    public static NetworkManager getInstance() {
        if (networkManager == null) {
            networkManager = new NetworkManager();
        }
        return networkManager;
    }

    public native boolean initialize(String name);

    public native boolean createAndConnectToNetwork(String type, String languageCode);

    public native boolean joinNetwork(String networkId);

    public native void leaveNetwork();

    public native void sendTextMessage(String message, boolean isTTS);

    public native void doWork();

    public native void getPlayerState();

    public native void setLanguage(int idx);

    public native void setPlayFabTitleID(String titleID);

    public void onNetworkCreated(String network) {
        Log.d(getClass().getSimpleName(), "onNetworkCreated: " + network);
        getMessageManager().sendNetworkCreatedMessage(network);
        getMessageManager().sendErrorMessage("Connected to network: " + network);
    }

    public void onMessageReceived(String sender, String message) {
        Log.d(getClass().getSimpleName(), "onMessageReceived: " + sender + ": " + message);
        getMessageManager().sendTextMsgReceivedMessage(sender, message, false);
    }

    public void onTranscriptMessageReceived(String sender, String message) {
        Log.d(getClass().getSimpleName(), "onTranscriptMessageReceived: " + sender + ": " + message);
        getMessageManager().sendTextMsgReceivedMessage(sender, message, true);
    }

    public void onPlayerJoined(String playerId, String name) {
        Log.d(getClass().getSimpleName(), "onPlayerJoined: " + playerId + ": " + name);
        getMessageManager().sendPlayerJoinMessage(playerId, name);
    }

    public void onPlayerLeft(String playerId) {
        Log.d(getClass().getSimpleName(), "onPlayerLeft: " + playerId);
        getMessageManager().sendPlayerLeftMessage(playerId);
    }

    public void toastMessage(String message) {
        getMessageManager().toastMessage(message);
    }

    public void resetChat(String error) {
        getMessageManager().sendResetMessage(error);
    }
    public void resetMessage() {
        getMessageManager().sendResetMessage("Left");
    }

    public void addErrorMessage(String message) {
        getMessageManager().sendErrorMessage(message);
    }

   public void updatePlayerState(String playerId, String state) {
        Log.d(getClass().getSimpleName(), "updatePlayerState: " + playerId + ": " + state);
        getMessageManager().sendPlayerStatusMessage(playerId, state);
    }

    public MessageManager getMessageManager() {
        return MessageManager.getInstance();
    }

}

Die oben genannte JNI-Brücke wird von einer reinen C++-Implementierungsdatei unterstützt, die in die NetworkManager.cpp aufruft, die wiederum die Party-APIs aufruft.

Hier ist ein Beispielausschnitt, der die verschiedenen Ebenen zeigt:

Die NetworkManager-Java-Schnittstelle macht eine Methode zum Beitreten zu einem Parteinetzwerk verfügbar.

public native boolean joinNetwork(String networkId);

Die Implementierung von joinNetwork befindet sich in der C++-Ebene in PartyDemo.cpp unten dargestellt.

JNIEXPORT jboolean JNICALL
    Java_com_microsoft_playfab_party_sdk_NetworkManager_joinNetwork(
        JNIEnv* env,
        jobject thiz,
        jstring networkId
        )
    {
        if (g_isRunning && g_initializeCompleted)
        {
            Managers::Get<NetworkManager>()->Initialize(g_playfabTitleId.c_str());
            const char* networkNameCStr = env->GetStringUTFChars(networkId, NULL);
            g_networkName = networkNameCStr;
            env->ReleaseStringUTFChars(networkId, networkNameCStr);
            g_isSpinDone = false;
            Managers::Get<PlayFabManager>()->GetDescriptor(
                    g_networkName,
                    [](std::string networkDescriptor)
                    {
                        SendSysLogToUI("OnGetDescriptorForConnectTo : %s", networkDescriptor.c_str());
                        g_networkDescriptor = networkDescriptor;
                        ReleaseSpin();
                    }
            );

            HoldSpin();
            // When network connection is not stable, waiting for ConnectToNetwork callback will cost longer time.
            // To avoid App UI busy waiting, return to UI after ConnectToNetwork returns.
            Managers::Get<NetworkManager>()->ConnectToNetwork(
                g_networkName.c_str(),
                g_networkDescriptor.c_str(),
                []()
                {
                    OnNetworkConnected(g_networkName);
                    SendSysLogToUI("OnConnectToNetwork succeeded");
                },
                [](PartyError error)
                {
                    SendSysLogToUI("OnConnectToNetworkFailed %s", GetErrorMessage(error));
                    ResetChat(GetErrorMessage(error));
                });

            return true;
        }
        else
        {
            SendSysLogToUI("Please waiting for initialization done.");
            return false;
        }
    }

Im obigen Codeausschnitt rufen die joinNetwork Aufrufe NetworkManager::CreateAndConnectToNetwork() von auf, die wiederum die unformatierte Party-API aufruft, die in "Party.h" verfügbar gemacht wird.

void 
NetworkManager::CreateAndConnectToNetwork(
    const char *networkId, 
    std::function<void(std::string)> callback, 
    std::function<void(PartyError)> errorCallback
    )
{
    DEBUGLOG("NetworkManager::CreateAndConnectToNetwork()\n");

    PartyNetworkConfiguration cfg = {};

    // Setup the network to allow the maximum number of single-device players of any device type
    cfg.maxDeviceCount = c_maxNetworkConfigurationMaxDeviceCount;
    cfg.maxDevicesPerUserCount = 1;
    cfg.maxEndpointsPerDeviceCount = 1;
    cfg.maxUserCount = c_maxNetworkConfigurationMaxDeviceCount;
    cfg.maxUsersPerDeviceCount = 1;

    //Get the uid from the local chat control
    PartyString uid = nullptr;
    PartyError err = m_localUser->GetEntityId(&uid);

    if (PARTY_FAILED(err))
    {
        DEBUGLOG("GetUserIdentifier failed: %s\n", GetErrorMessage(err));
        errorCallback(err);
        return;
    }

    // Setup the network invitation configuration to use the network id as an invitation id and allow anyone to join.
    PartyInvitationConfiguration invitationConfiguration{
        networkId,                                  // invitation identifier
        PartyInvitationRevocability::Anyone,        // revokability
        0,                                          // authorized user count
        nullptr                                     // authorized user list
    };

    // Initialize an empty network descriptor to hold the result of the following call.
    PartyNetworkDescriptor networkDescriptor = {};

    // Create a new network descriptor
    err = PartyManager::GetSingleton().CreateNewNetwork(
        m_localUser,                                // Local User
        &cfg,                                       // Network Config
        0,                                          // Region List Count
        nullptr,                                    // Region List
        &invitationConfiguration,                   // Invitation configuration
        nullptr,                                    // Async Identifier
        &networkDescriptor,                         // OUT network descriptor
        nullptr                                     // applied initialinvitationidentifier.
    );

    if (PARTY_FAILED(err))
    {
        DEBUGLOG("CreateNewNetwork failed: %s\n", GetErrorMessage(err));
        errorCallback(err);
        return;
    }

    // Connect to the new network
    if (InternalConnectToNetwork(networkDescriptor, networkId, errorCallback))
    {
        m_state = NetworkManagerState::WaitingForNetwork;
        m_onnetworkcreated = callback;
        m_onnetworkcreatederror = errorCallback;
        m_onnetworkconnectedError = errorCallback;
    }
}

Auf ähnliche Weise wird jede Methode in der NetworkManager JNI-Schnittstelle über PartyDemo und NetworkManager der Party-API zugeordnet.

Nächste Schritte

In diesem Artikel haben wir erfahren, wie Sie mit der Integration der Party-Bibliothek in Ihre Android-Anwendung beginnen. Informationen zum Einrichten der restlichen Bausteine der PlayFab Party finden Sie unter Schnellstart für playFab Party.