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

# Inicio rápido de Java para Native y Android Studio

> Descargue los archivos JAR del SDK de cliente de Java de PlayFab, configure la classpath y realice su primera llamada API LoginWithCustomID en Java nativo o Android.

Este inicio rápido le permite ponerse en marcha con el JavaSDK de PlayFab y un programa de Java sencillo.

Antes de poder llamar a cualquier API de PlayFab, debe tener una [cuenta de desarrollador de PlayFab](https://developer.playfab.com).

Los objetivos de este tutorial son:

* Adquirir los archivos JAR necesarios.

* Agregar los archivos JAR a la classpath.

* Crear una aplicación de consola de Java mínima que ejecute la [llamada API de inicio de sesión con id. personalizado](xref:titleid.playfabapi.com.client.authentication.loginwithcustomid).

## Adquirir los archivos JAR necesarios

Para utilizar el JavaSDK de PlayFab, necesitamos el JavaSDK de cliente de PlayFab y su dependencia, Google GSON.

Descargue la biblioteca JAR del JavaSDK de cliente de PlayFab [aquí](https://github.com/PlayFab/JavaSDK/tree/versioned/builds). Busque **client-sdk-\*.jar** y el Java Doc correspondiente \[opcional pero útil].

Puede descargar la versión más reciente de Google GSON [aquí](https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.0/). Busque **gson-\*.jar**.

## Configuración del proyecto con Intellij Idea

Una vez que haya inicializado un proyecto de Java sencillo de Intellij Idea, asegúrese de colocar los archivos JAR necesarios como se muestra en el ejemplo siguiente.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-proj-setup.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=85dc548792dd8ba7c4dffd3eaddd3d43" alt="Intellij - Configuración del proyecto" width="473" height="299" data-path="images/playfab/sdks/java/intellij-proj-setup.png" />

El paso siguiente es agregar los archivos JAR a la classpath. Vaya a **File** -> **,** como se muestra en el ejemplo siguiente.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-add-jar-files-to-classpath.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=167ce0cbbce7cefb93979d2ccfa8b896" alt="Intellij - Agregar archivos jar a la classpath" width="388" height="435" data-path="images/playfab/sdks/java/intellij-add-jar-files-to-classpath.png" />

Vaya a **Libraries** y agregue una nueva biblioteca de Java como se ilustra en la imagen que se proporciona a continuación.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-add-new-java-library.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=db7b46a3ccb01057f0d1e66474ab828c" alt="Intellij - Agregar una nueva biblioteca de Java" width="395" height="361" data-path="images/playfab/sdks/java/intellij-add-new-java-library.png" />

Seleccione los archivos JAR que agregó a la carpeta libs y, después, seleccione **OK**, como se muestra a continuación.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-select-jar-files.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=e60d7b28a9a1880a0ddd32661d6c7765" alt="Intellij - Seleccionar archivos jar" width="574" height="529" data-path="images/playfab/sdks/java/intellij-select-jar-files.png" />

Si se le pide el **Module**, seleccione el primero de la lista. Asegúrese de que todos los archivos JAR se hayan agregado a la lista de bibliotecas.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-ensure-jar-files-added.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=6dc524df20ee6c2b4a2cb3a894fd83c2" alt="Intellij - Asegurarse de que se agregaron los archivos jar" width="876" height="372" data-path="images/playfab/sdks/java/intellij-ensure-jar-files-added.png" />

## Configuración del proyecto con cualquier IDE

El requisito principal es tener los archivos JAR agregados a la classpath. Consulte la guía de su IDE sobre cómo agregar archivos JAR a la classpath.

## Configurar la primera llamada API

Use el código que se muestra a continuación como código de la clase principal.

```java theme={null}
import java.util.concurrent.*;
import java.util.*;

import com.playfab.PlayFabErrors.*;
import com.playfab.PlayFabSettings;
import com.playfab.PlayFabClientModels;
import com.playfab.PlayFabClientAPI;

public class Main
{
    private static boolean _running = true;

    public static void main(String[] args) {
        PlayFabSettings.TitleId = "144";

        PlayFabClientModels.LoginWithCustomIDRequest request = new PlayFabClientModels.LoginWithCustomIDRequest();
        request.CustomId = "GettingStartedGuide";
        request.CreateAccount = true;

        FutureTask<PlayFabResult<com.playfab.PlayFabClientModels.LoginResult>> loginTask = PlayFabClientAPI.LoginWithCustomIDAsync(request);
        loginTask.run();

        while (_running) {
            if (loginTask.isDone()) { // You would probably want a more sophisticated way of tracking pending async API calls in a real game
                OnLoginComplete(loginTask);
            }

            // Presumably this would be your main game loop, doing other things
            try {
                Thread.sleep(1);
            } catch(Exception e) {
                System.out.println("Critical error in the example main loop: " + e);
            }
        }
    }

    private static void OnLoginComplete(FutureTask<PlayFabResult<com.playfab.PlayFabClientModels.LoginResult>> loginTask) {
        PlayFabResult<com.playfab.PlayFabClientModels.LoginResult> result = null;
        try {
            result = loginTask.get(); // Wait for the result from the async call
        } catch(Exception e) {
            System.out.println("Exception in PlayFab api call: " + e); // Did you assign your PlayFabSettings.TitleId correctly?
        }

        if (result != null && result.Result != null) {
            System.out.println("Congratulations, you made your first successful API call!");
        } else if (result != null && result.Error != null) {
            System.out.println("Something went wrong with your first API call.");
            System.out.println("Here's some debug information:");
            System.out.println(CompileErrorsFromResult(result));
        }

        _running = false; // Because this is just an example, successful login triggers the end of the program
    }

    // This is a utility function we haven't put into the core SDK yet. Feel free to use it.
    private static <RT> String CompileErrorsFromResult(PlayFabResult<RT> result) {
        if (result == null || result.Error == null)
            return null;

        String errorMessage = "";
        if (result.Error.errorMessage != null)
            errorMessage += result.Error.errorMessage;
        if (result.Error.errorDetails != null)
            for (Map.Entry<String, List<String>> pair : result.Error.errorDetails.entrySet() )
                for (String msg : pair.getValue())
                    errorMessage += "\n" + pair.getKey() + ": " + msg;
        return errorMessage;
    }
}
```

## Finalizar y ejecutar

Para ejecutar la aplicación:

1. Seleccione la **flecha de reproducción >** en la esquina superior derecha. Esto iniciará la ejecución del programa y aparecerá el panel de salida.
2. Busque el **mensaje de depuración**. Esto indica que la llamada API se realizó correctamente.

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/java/intellij-run-program.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=04ce4add6100b9b56db869bf97baadbb" alt="Intellij - Ejecutar el programa" width="968" height="719" data-path="images/playfab/sdks/java/intellij-run-program.png" />

En este punto, puede empezar a realizar otras llamadas API y a crear su juego.

Para obtener una lista de todas las llamadas API de cliente disponibles, consulte nuestra documentación de [referencias de API de PlayFab](/services/playfab/api-references).

## Análisis del código

Esta última sección opcional describe en detalle cada línea de `GettingStarted.java`.

* Importaciones
  * Este es el conjunto mínimo de importaciones que se usa para realizar llamadas API de PlayFab.

* public static void `main(String[] args) {`
  * Simplemente un bucle básico que inicia una llamada API y espera a que se complete.

  * `PlayFabSettings.TitleId = "xxxx"`;
    * Cada desarrollador de PlayFab crea un título en Game Manager. Cuando publique su juego, debe codificar ese titleId en el juego. Esto permite al cliente saber cómo acceder a los datos correctos dentro de PlayFab. Para la mayoría de los usuarios, considérelo simplemente un paso obligatorio que hace que PlayFab funcione.

  * `PlayFabClientModels.LoginWithCustomIDRequest request = new PlayFabClientModels.LoginWithCustomIDRequest();`
    * La mayoría de los métodos de la API de PlayFab requieren parámetros de entrada, y esos parámetros de entrada se empaquetan en un objeto de solicitud.

    * Cada método de la API requiere un objeto de solicitud único, con una combinación de parámetros opcionales y obligatorios.
      * En el caso de `LoginWithCustomIDRequest`, hay un parámetro obligatorio, `CustomId`, que identifica de forma única a un jugador, y `CreateAccount`, que permite crear una cuenta nueva con esta llamada.

    * Para el inicio de sesión, la mayoría de los desarrolladores querrán usar un método de inicio de sesión más apropiado.
      * Consulte la documentación de inicio de sesión de PlayFab para obtener una lista de todos los métodos de inicio de sesión y sus parámetros de entrada. Las opciones habituales son:
        * `LoginWithAndroidDeviceID`
        * `LoginWithIOSDeviceID`
        * `LoginWithEmailAddress`

  * `FutureTask<PlayFabResult<com.playfab.PlayFabClientModels.LoginResult>> loginTask = PlayFabClientAPI.LoginWithCustomIDAsync(request)`;
    * Esto inicia la solicitud asincrónica a `LoginWithCustomID`, mediante el marco FutureTask de Java.

  * While (running) `{ if (loginTask.isDone()) { OnLoginComplete(loginTask); } }`
    * Ejecuta un bucle principal trivial y espera de forma asincrónica a que loginTask se complete.
    * Cuando termine, llama a `OnLoginComplete`.

* `OnLoginComplete (loginTask)`
  * `result = loginTask.get()`;
    * Captura el resultado asincrónico (esto no provocará un bloqueo, porque confirmamos que la FutureTask ya está completa).

  * Si (`result.Result != null`), la llamada API se realizó correctamente.
    * Cuando se realiza correctamente, el objeto `result.Result` de muchas devoluciones de llamada de la API contendrá la información solicitada.

    * `LoginResult`, en concreto, contiene información básica sobre el jugador.  Pero para la mayoría de los usuarios, el inicio de sesión es simplemente un paso obligatorio antes de llamar a otras API.

  * Si (`result.Error != null`), la llamada API ha fallado.
    * Las llamadas API pueden fallar por muchos motivos, y siempre debe intentar controlar el error.
    * Por qué fallan las llamadas API (en orden de probabilidad)
      * `PlayFabSettings.TitleId` no está establecido. Si olvida establecer `TitleId` en su título, nada funcionará.
      * Parámetros de solicitud. Si no ha proporcionado la información correcta o requerida para una llamada API concreta, esta fallará. Consulte `error.errorMessage`, `error.errorDetails` o `error.GenerateErrorReport()` para obtener más información.
      * Problema de conectividad del dispositivo. Los teléfonos móviles pierden y recuperan la conectividad constantemente, por lo que cualquier llamada API en cualquier momento puede fallar aleatoriamente y funcionar inmediatamente después. Entrar en un túnel puede desconectarlo por completo.
      * Problema del servidor de PlayFab. Como con todo el software, puede haber problemas. Consulte nuestras [notas de la versión](/services/playfab/release-notes) para ver las actualizaciones.
      * Internet no es 100 % confiable. A veces, el mensaje se daña o no llega al servidor de PlayFab.

  * Si tiene dificultades para depurar un problema y la información incluida en los datos del error no es suficiente, visítenos en nuestros [foros](https://community.playfab.com/index.html).


## Related topics

- [Inicio rápido de JavaScript para Native y Phaser](/es/services/playfab/sdks/javascript/quickstart.md)
- [Inicio rápido de Android](/es/services/playfab/sdks/c/quickstart-android.md)
- [Inicio rápido de notificaciones push](/es/services/playfab/live-service-management/game-configuration/title-communications/push-notifications/quickstart.md)
- [PlayFab Services para Android](/es/services/playfab/sdks/platforms/android.md)
- [SDK de C++ heredado de PlayFab](/es/services/playfab/sdks/playfab-cpp/index.md)
