> ## 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 propre à Android pour le SDK PlayFab Party, y compris les exigences du NDK, l'initialisation JNI et les autorisations audio et microphone dans le manifeste.

Ce document présente les prérequis et exigences de base nécessaires à l'intégration de PlayFab Party dans vos applications Android. Une fois votre système configuré conformément à ce document, consultez le [Démarrage rapide de PlayFab Party](/fr-CA/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 que les prérequis suivants sont respectés :

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 des fichiers d'en-tête requis

Vous devez inclure les fichiers d'en-tête suivants provenant du [référentiel de distribution de 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>
  En plus des fichiers lib et des en-têtes ci-dessus, vous aurez également besoin des bibliothèques et des en-têtes du SDK PlayFab ainsi que de toute autre dépendance propre à 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++, nous devons créer une classe wrapper JNI simple 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. Nous avons réalisé cela dans notre application de démonstration 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), lequel appelle à son tour les API Party.

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

L'interface Java NetworkManager expose une méthode pour 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), illustré 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 au moyen 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-CA/services/playfab/multiplayer/networking/quickstart) pour mettre en place les autres composants de base de PlayFab Party.


## Related topics

- [Ajouter des services backend avec PlayFab](/fr/home/build-first-title/add-backend-services.md)
- [Intégration des partenaires XBOX : accès et publication](/fr/home/onboarding.md)
- [Notes de version de PlayFab Party](/fr-CA/services/playfab/multiplayer/networking/release-notes.md)
- [Documentation de développement de jeux XBOX](/fr/index.md)
- [Exigences XBOX testées lors de la certification pour les jeux sur console XBOX](/fr-CA/publishing/certification/console-cert-tested-requirements.md)
