次の方法で共有


Android の使用

このドキュメントでは、PlayFab Party を Android アプリケーションに統合するために必要な基本的な前提条件と要件を一覧表示します。 このドキュメントに従ってシステムをセットアップしたら、PlayFab Party の文書パーツを使用してセットアップを行うために、PlayFab Party 向けクイックスタートをご覧ください。

前提条件

このチュートリアルを始める前に、以下の前提条件が満たされていることを確認してください。

  1. PlayFab 開発者アカウントを作成しました。

  2. PlayFab タイトルを作成し、そのタイトルが PlayFab Party に許可されました。

  3. Android Studio バージョン 3.2 以降がインストールされています。

  4. アプリのターゲットは Android 4.4 (Kitkat) 以上です。

  5. Android NDK 18.1.5063045 以降がインストールされています。

  6. PlayFab Party プラットフォーム レポジトリにアクセスしました

  7. Android 署名証明書を作成し、証明書構成を使用して展開用にアプリに署名しました。

必要なライブラリやヘッダー ファイルを含む

[PlayFab Party 配布用リポジトリ] から次のヘッダー ファイルを含める必要があります。

LIB ファイル

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

注意

SSL ライブラリは、 Open SSL バージョン 1.1.1b-dev からビルドされています。 OpenSSL のバージョン 1.1.1b-dev 以上を使用してください。

ヘッダーが含む

パーティー ヘッダー

注意

上記の LIB ファイルとヘッダー、PlayFab SDK 用の LIB とヘッダーに加えて、アプリが必要とするその他のプラットフォーム固有の依存関係が必要になります。 詳細については、Android サンプルのプロジェクト ファイル組織をご覧ください。

Android で PlayFab Party を動作させるための手順

コア パーティ ライブラリは C++ を使用して記述されているため、パーティー ライブラリ機能にアクセスするには、単純な JNI ラッパー クラスを作成する必要があります。 高いレベルで、ネットワークの作成、ネットワークへの接続、およびネットワーク経由でのメッセージ送信を行う Party API メソッドにアクセスできるクラスが必要です。 デモ アプリでは、NetworkManager Java クラスを介してこれを実現しました。


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

}

上記の JNI ブリッジは、NetworkManager.cpp を呼び出す純粋な C++ の実装ファイルで支えられています。このファイルは、Party API を順番に呼び出します。

こちらは、さまざまなレイヤーを示すスニペットの例です。

NetworkManager Java インターフェイスは、パーティー ネットワークに参加するメソッドを公開します。

public native boolean joinNetwork(String networkId);

joinNetwork の実装は、次に示す PartyDemo.cppの C++ レイヤーにあります。

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

上記のコード スニペットでは、joinNetworkNetworkManager::CreateAndConnectToNetwork() を呼び出し、Party.hで公開されている未加工のパーティー API を呼び出します。

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

同様に、NetworkManager JNI インターフェイスの各メソッドは、PartyDemo と NetworkManager を介してパーティー API にマップされます。

次の手順

この記事では、Party ライブラリを Android アプリケーションに統合する方法をご紹介します。 PlayFab パーティーの残りの構成要素の設定については、「PlayFab パーティーのクイックスタート」を参照してください。