> ## 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.

# Introducción a Android

> Configuración específica de Android para el SDK de PlayFab Party, incluidos los requisitos de NDK, la inicialización de JNI y los permisos de audio y micrófono en el manifiesto.

Este documento enumera los requisitos previos y requisitos básicos necesarios para integrar PlayFab Party en sus aplicaciones Android. Una vez que haya configurado su sistema de acuerdo con este documento, consulte el [Inicio rápido para PlayFab Party](/services/playfab/multiplayer/networking/quickstart) para empezar a trabajar con los bloques de creación de PlayFab Party.

## Requisitos previos

Antes de comenzar este tutorial, asegúrese de que se cumplen los siguientes requisitos previos:

1. Ha creado una [cuenta de desarrollador de PlayFab](https://developer.playfab.com).

2. Ha creado un título de PlayFab y su título se ha agregado a la lista de permitidos para PlayFab Party.

3. Tiene instalado Android Studio versión 3.2 o superior.

4. Su aplicación tiene como destino Android 4.4 (Kitkat) o superior.

5. Tiene instalado el Android NDK 18.1.5063045 o superior.

6. Tiene acceso al [repositorio de plataformas de PlayFab Party](https://github.com/PlayFab/PlayFabParty/releases)

7. Ha creado un certificado de firma de Android y ha firmado su aplicación para la implementación mediante la configuración del certificado.

## Inclusión de las bibliotecas y los archivos de encabezado necesarios

Deberá incluir los siguientes archivos de encabezado del [repositorio de distribución de PlayFab Party](https://github.com/PlayFab/PlayFabParty).

Archivos LIB

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

<Note>
  Las bibliotecas SSL se compilan a partir de [Open SSL versión 1.1.1b-dev](https://github.com/openssl/openssl/tree/OpenSSL_1_1_1-stable). Use una versión de openSSL que sea 1.1.1b-dev o superior.
</Note>

Encabezados incluidos

[Encabezados de Party](https://github.com/PlayFab/PlayFabParty/tree/master/include)

<Note>
  Además de los archivos lib y los encabezados anteriores, también necesitará las bibliotecas y los encabezados del SDK de PlayFab y cualquier otra dependencia específica de la plataforma que necesite su aplicación. Eche un vistazo a la organización de archivos del proyecto del ejemplo de Android para obtener más información.
</Note>

## Pasos para hacer que PlayFab Party funcione en Android

Dado que la biblioteca principal de Party está escrita con C++, necesitaremos crear una clase contenedora JNI sencilla para acceder a la funcionalidad de la biblioteca de Party. A grandes rasgos, querrá una clase que tenga acceso a los métodos de la API de Party para crear una red, conectarse a una red y enviar mensajes a través de una red. Lo hemos logrado en nuestra aplicación de demostración a través de la [clase 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();
    }

}
```

El puente JNI anterior está respaldado por un archivo de implementación de C++ puro que llama a [NetworkManager.cpp](https://github.com/PlayFab/PlayFabParty/blob/docs/android/PartySampleNetworkCommon/lib/NetworkManager.cpp), que a su vez llama a las API de Party.

Aquí tiene un fragmento de ejemplo que muestra las distintas capas:

La interfaz Java NetworkManager expone un método para unirse a una red de Party.

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

La implementación de `joinNetwork` está en la capa de C++ en [PartyDemo.cpp](https://github.com/PlayFab/PlayFabParty/blob/docs/android/PartySample/demo/src/main/cpp/PartyDemo.cpp), que se muestra a continuación.

```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;
        }
    }
```

En el fragmento de código anterior, `joinNetwork` llama a `NetworkManager::CreateAndConnectToNetwork()`, que a su vez llama a la API de Party sin procesar expuesta en [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 forma similar, cada método de la interfaz JNI de NetworkManager se asigna a la API de Party a través de PartyDemo y NetworkManager.

## Pasos siguientes

En este artículo vimos cómo empezar a integrar la biblioteca de Party en su aplicación Android. Consulte el [Inicio rápido para PlayFab Party](/services/playfab/multiplayer/networking/quickstart) para empezar a trabajar con el resto de los bloques de creación de PlayFab Party.


## Related topics

- [Introducción a Android Studio y las notificaciones push](/es/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/getting-started-android-studio-push-notifications.md)
- [Introducción a Multiplayer para Android](/es/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/android-specific-requirements.md)
- [Introducción a Economy v2, Unity IAP y Android](/es/services/playfab/economy-monetization/economy-v2/tutorials/getting-started-with-unity-and-android.md)
- [Introducción a PlayFab Economy heredado, Unity IAP y Android](/es/services/playfab/economy-monetization/economy/tutorials/getting-started-with-unity-iap-android.md)
- [Notificaciones push para Android](/es/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/push-notifications-for-android.md)
