> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Prise en main sur Android

> Configuration spécifique à Android du SDK PlayFab Party, notamment la configuration requise pour le NDK, l'initialisation JNI et les autorisations audio et microphone dans le manifeste.

Ce document répertorie les prérequis et la configuration de base nécessaires pour intégrer PlayFab Party à vos applications Android. Une fois votre système configuré conformément à ce document, consultez le [Démarrage rapide de PlayFab Party](/fr/services/playfab/multiplayer/networking/quickstart) pour mettre en place les composants de base de PlayFab Party.

## Prérequis

Avant de commencer ce tutoriel, assurez-vous de remplir les prérequis suivants :

1. Vous avez créé un [compte de développeur PlayFab](https://developer.playfab.com).

2. Vous avez créé un titre PlayFab, et votre titre a été ajouté à la liste d'autorisation de PlayFab Party.

3. Android Studio version 3.2 ou ultérieure est installé.

4. Votre application cible Android 4.4 (KitKat) ou une version ultérieure.

5. Le NDK Android 18.1.5063045 ou une version ultérieure est installé.

6. Vous avez accès au [référentiel des plateformes PlayFab Party](https://github.com/PlayFab/PlayFabParty/releases)

7. Vous avez créé un certificat de signature Android et signé votre application pour le déploiement à l'aide de la configuration du certificat.

8. Les applications générées pour la plateforme Android doivent s'assurer que BLUETOOTH\_CONNECT figure dans le manifeste de l'application afin que Party puisse surveiller les appareils Bluetooth disponibles et s'y connecter.

## Inclusion des bibliothèques et fichiers d'en-tête requis

Vous devez inclure les fichiers d'en-tête suivants depuis le [référentiel de distribution PlayFab Party](https://github.com/PlayFab/PlayFabParty).

Fichiers LIB

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

<Note>
  Les bibliothèques SSL sont générées à partir d'[OpenSSL version 3.5.7](https://github.com/openssl/openssl/releases#release-openssl-3.5.7). Utilisez une version d'OpenSSL 3.5.7 ou ultérieure.
</Note>

Inclusions d'en-têtes

[En-têtes Party](https://github.com/PlayFab/PlayFabParty/tree/master/include)

<Note>
  Outre les fichiers lib et les en-têtes ci-dessus, vous aurez également besoin des bibliothèques et en-têtes du SDK PlayFab ainsi que de toute autre dépendance spécifique à la plateforme requise par votre application. Pour plus d'informations, consultez l'organisation des fichiers du projet de l'exemple Android.
</Note>

## Étapes pour faire fonctionner PlayFab Party sur Android

Comme la bibliothèque principale de Party est écrite en C++, vous devez créer une classe wrapper JNI pour accéder aux fonctionnalités de la bibliothèque Party. Globalement, vous aurez besoin d'une classe ayant accès aux méthodes de l'API Party pour créer un réseau, se connecter à un réseau et envoyer des messages sur un réseau. Dans notre application de démonstration, nous l'avons fait au moyen de la [classe Java NetworkManager](https://github.com/PlayFab/PlayFabParty/blob/docs/android/PartySample/demo/src/main/java/com/microsoft/playfab/party/sdk/NetworkManager.java).

```java theme={null}

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();
    }

}
```

Le pont JNI ci-dessus s'appuie sur un fichier d'implémentation en C++ pur qui appelle [NetworkManager.cpp](https://github.com/PlayFab/PlayFabParty/blob/docs/android/PartySampleNetworkCommon/lib/NetworkManager.cpp), qui appelle à son tour les API Party.

Voici un exemple d'extrait qui montre les différentes couches :

L'interface Java NetworkManager expose une méthode permettant de rejoindre un réseau Party.

```java theme={null}
public native boolean joinNetwork(String networkId);
```

L'implémentation de `joinNetwork` se trouve dans la couche C++, dans [PartyDemo.cpp](https://github.com/PlayFab/PlayFabParty/blob/docs/android/PartySample/demo/src/main/cpp/PartyDemo.cpp), présentée ci-dessous.

```cpp theme={null}
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;
        }
    }
```

Dans l'extrait de code ci-dessus, `joinNetwork` appelle `NetworkManager::CreateAndConnectToNetwork()`, qui appelle à son tour l'API Party brute exposée dans [Party.h](https://github.com/PlayFab/PlayFabParty/blob/docs/include/Party.h)

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

    // Set the maximum number of devices allowed in a network to 16 devices
    constexpr uint8_t c_maxSampleNetworkDeviceCount = 16;
    static_assert(c_maxSampleNetworkDeviceCount <= c_maxNetworkConfigurationMaxDeviceCount, "Must be less than or equal to c_maxNetworkConfigurationMaxDeviceCount.");

    // Initialize network configuration for Party Network.
    PartyNetworkConfiguration cfg = {};
    cfg.maxDeviceCount = c_maxSampleNetworkDeviceCount;
    cfg.maxDevicesPerUserCount = 1;
    cfg.maxEndpointsPerDeviceCount = 1;
    cfg.maxUserCount = c_maxSampleNetworkDeviceCount;
    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;
    }
}
```

De la même manière, chaque méthode de l'interface JNI NetworkManager est mappée à l'API Party par l'intermédiaire de PartyDemo et de NetworkManager.

## Étapes suivantes

Dans cet article, nous avons vu comment commencer à intégrer la bibliothèque Party à votre application Android. Consultez le [Démarrage rapide de PlayFab Party](/fr/services/playfab/multiplayer/networking/quickstart) pour mettre en place les autres composants de base de PlayFab Party.


## Related topics

- [Prise en main de Multiplayer sur Android](/fr/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/android-specific-requirements.md)
- [Prise en main de PlayFab Economy (hérité), Unity IAP et Android](/fr/services/playfab/economy-monetization/economy/tutorials/getting-started-with-unity-iap-android.md)
- [Prise en main d'Android Studio et des notifications push](/fr/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/getting-started-android-studio-push-notifications.md)
- [Prise en main sur Linux](/fr/services/playfab/multiplayer/networking/linux-specific-requirements.md)
- [Prise en main sur iOS et macOS](/fr/services/playfab/multiplayer/networking/apple-specific-requirements.md)
