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

# 適用於原生與 Android Studio 的 Java 快速入門

> 下載 PlayFab Java 用戶端 SDK JAR 檔案、設定類別路徑，並在原生 Java 或 Android 中進行您的第一次 LoginWithCustomID API 呼叫。

本快速入門可讓您開始使用 PlayFab JavaSDK 和簡單的 Java 程式。

您必須先擁有 [PlayFab 開發人員帳戶](https://developer.playfab.com)，才能呼叫任何 PlayFab API。

本教學課程的目標如下：

* 取得必要的 JAR 檔案。

* 將 JAR 檔案新增至類別路徑。

* 建立最精簡的 Java 主控台應用程式，以執行[自訂識別碼登入 API 呼叫](xref:titleid.playfabapi.com.client.authentication.loginwithcustomid)。

## 取得必要的 JAR 檔案

若要使用 PlayFab JavaSDK，我們需要 PlayFab Client JavaSDK 及其相依性 Google GSON。

請在[這裡](https://github.com/PlayFab/JavaSDK/tree/versioned/builds)下載 PlayFab Client JavaSDK JAR 程式庫。尋找 **client-sdk-\*.jar** 以及對應的 Java Doc (選擇性，但很實用)。

您可以在[這裡](https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.0/)下載最新的 Google GSON。尋找 **gson-\*.jar**。

## 使用 Intellij Idea 設定專案

初始化簡單的 Intellij Idea Java 專案後，請務必依照下列範例所示放置必要的 JAR 檔案。

<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 - 專案設定" width="473" height="299" data-path="images/playfab/sdks/java/intellij-proj-setup.png" />

下一步是將 JAR 檔案新增至類別路徑。如下列範例所示，瀏覽至 **File** -> **,**。

<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 - 將 jar 檔案新增至類別路徑" width="388" height="435" data-path="images/playfab/sdks/java/intellij-add-jar-files-to-classpath.png" />

瀏覽至 **Libraries**，然後如下方圖片所示新增 Java 程式庫。

<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 - 新增 Java 程式庫" width="395" height="361" data-path="images/playfab/sdks/java/intellij-add-new-java-library.png" />

選取您新增至 libs 資料夾的 JAR 檔案，然後選取 **OK**，如下所示。

<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 - 選取 jar 檔案" width="574" height="529" data-path="images/playfab/sdks/java/intellij-select-jar-files.png" />

如果系統要求您選擇 **Module**，請選取清單中的第一個。確定所有 JAR 檔案都已新增至程式庫清單。

<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 - 確定已新增 jar 檔案" width="876" height="372" data-path="images/playfab/sdks/java/intellij-ensure-jar-files-added.png" />

## 使用任何 IDE 設定專案

主要需求是將 JAR 檔案新增至類別路徑。請參閱您 IDE 的指南，了解如何將 JAR 檔案新增至類別路徑。

## 設定您的第一次 API 呼叫

使用下方所示的程式碼作為您的主要類別程式碼。

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

## 完成並執行

若要執行應用程式：

1. 選取右上角的 **play arrow >**。這會開始執行程式，並顯示輸出面板。
2. 找到**偵錯訊息**。這表示 API 呼叫已成功。

<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 - 執行程式" width="968" height="719" data-path="images/playfab/sdks/java/intellij-run-program.png" />

現在，您可以開始進行其他 API 呼叫並建置您的遊戲。

如需所有可用用戶端 API 呼叫的清單，請參閱我們的 [PlayFab API 參考](/zh-TW/services/playfab/api-references)文件。

## 解構程式碼

這個選擇性的最後一節會詳細說明 `GettingStarted.java` 中的每一行。

* Imports
  * 這是進行 PlayFab API 呼叫所使用的最精簡 import 集合。

* public static void `main(String[] args) {`
  * 只是一個基本迴圈，會啟動 API 呼叫並等候其完成。

  * `PlayFabSettings.TitleId = "xxxx"`;
    * 每位 PlayFab 開發人員都會在 Game Manager 中建立遊戲。當您發佈遊戲時，必須將該 titleId 寫入遊戲程式碼中。這可讓用戶端知道如何存取 PlayFab 中正確的資料。對大多數使用者而言，只要將其視為讓 PlayFab 運作的必要步驟即可。

  * `PlayFabClientModels.LoginWithCustomIDRequest request = new PlayFabClientModels.LoginWithCustomIDRequest();`
    * 大多數 PlayFab API 方法都需要輸入參數，而這些輸入參數會封裝在要求物件中。

    * 每個 API 方法都需要唯一的要求物件，其中包含選擇性和必要參數的組合。
      * 對於 `LoginWithCustomIDRequest`，有一個必要參數 `CustomId` 可唯一識別玩家，還有 `CreateAccount` 允許透過此呼叫建立新帳戶。

    * 對於登入，大多數開發人員會想要使用更合適的登入方法。
      * 如需所有登入方法和輸入參數的清單，請參閱 PlayFab 登入文件。常見的選擇包括：
        * `LoginWithAndroidDeviceID`
        * `LoginWithIOSDeviceID`
        * `LoginWithEmailAddress`

  * `FutureTask<PlayFabResult<com.playfab.PlayFabClientModels.LoginResult>> loginTask = PlayFabClientAPI.LoginWithCustomIDAsync(request)`;
    * 這會使用 Java FutureTask 架構，開始對 `LoginWithCustomID` 的非同步要求。

  * While (running) `{ if (loginTask.isDone()) { OnLoginComplete(loginTask); } }`
    * 執行一個簡單的主迴圈，並以非同步方式等候 loginTask 完成。
    * 完成時呼叫 `OnLoginComplete`。

* `OnLoginComplete (loginTask)`
  * `result = loginTask.get()`;
    * 擷取非同步結果 (這不會造成封鎖，因為我們已確認 FutureTask 已完成)。

  * 如果 (`result.Result != null`)，則表示 API 呼叫已成功。
    * 成功時，許多 API 回呼的 `result.Result` 物件會包含所要求的資訊。

    * `LoginResult` 特別包含玩家的一些基本資訊。但對大多數使用者而言，登入只是呼叫其他 API 之前的必要步驟。

  * 如果 (`result.Error != null`)，表示 API 呼叫已失敗。
    * API 呼叫可能因許多原因而失敗，您應該一律嘗試處理失敗情況。
    * API 呼叫失敗的原因 (依可能性排序)
      * 未設定 `PlayFabSettings.TitleId`。如果您忘記將 `TitleId` 設定為您的遊戲，則一切都無法運作。
      * 要求參數。如果您沒有為特定 API 呼叫提供正確或必要的資訊，呼叫就會失敗。如需詳細資訊，請參閱 `error.errorMessage`、`error.errorDetails` 或 `error.GenerateErrorReport()`。
      * 裝置連線問題。行動電話會不斷失去/恢復連線，因此任何 API 呼叫都可能隨時隨機失敗，然後又立即恢復正常。進入隧道可能會讓您完全中斷連線。
      * PlayFab 伺服器問題。就像所有軟體一樣，可能會發生問題。如需更新資訊，請參閱我們的[版本資訊](/zh-TW/services/playfab/release-notes)。
      * 網際網路並非 100% 可靠。有時訊息會損毀或無法送達 PlayFab 伺服器。

  * 如果您在偵錯問題時遇到困難，而錯誤資訊中的內容又不足夠，請造訪我們的[論壇](https://community.playfab.com/index.html)。


## Related topics

- [適用於原生與 Phaser 的 JavaScript 快速入門](/zh-TW/services/playfab/sdks/javascript/quickstart.md)
- [適用於 Windows 的 C++ 快速入門](/zh-TW/services/playfab/sdks/playfab-cpp/quickstart-windows.md)
- [適用於 Linux 的 C++ 快速入門](/zh-TW/services/playfab/sdks/playfab-cpp/quickstart-linux.md)
- [適用於 GDK 的 C/C++ 快速入門](/zh-TW/services/playfab/sdks/playfab-cpp/quickstart-gdk.md)
- [適用於 Android 的 PlayFab Services](/zh-TW/services/playfab/sdks/platforms/android.md)
