跳到主要内容

Android

UE4.21 ~ UE4.27 & UE5 ~ UE5.4
版本需求

androidx
minSdkVersion: 21
targetSdkVersion: 34
compileSdkVersion: 34

如果接入 LINE,minSdkVersion 需要升级到 24。

如果接入 DiscordDMM,minSdkVersion 需要升级到 23。

前提条件

警告

游戏使用的每个 SDK 插件的版本(包括游戏启动器使用的版本)必须保持一致。如果游戏需要同时访问多个版本的 Player Network SDK,或者只有一个组件需要升级,请联系 Player Network 助手。

  1. 在 Player Network 获取登录账号
  2. 创建新项目
  3. [可选] 邀请用户加入业务
  4. 下载 SDK

步骤1:安装 SDK

1. 将 Player Network SDK 添加到您的项目

  1. 解压 SDK 软件包。

  2. INTLSDK 文件夹复制到项目的 Plugins 文件夹中。
    如果项目中没有 Plugins 文件夹,请创建一个。

  3. 打开项目的 {项目名称}.Build.cs 文件,并按照示例将 Player Network SDK 添加到 Unreal Engine 中。

    public INTLSample(ReadOnlyTargetRules Target) : base(Target)
    {
    PrivateDependencyModuleNames.AddRange(new string[] {
    "INTLCore",
    "INTLFoundation",
    "INTLConfig",
    });
    }
Player Network SDK package
├─INTLSDK
│ ├─INTLSDK.uplugin // Player Network SDK plugins description files
│ ├─Resources // Player Network SDK resources
│ └─Source // Player Network SDK plugin modules. Each module contains its own Build.cs file, libraries, and interfaces.
│ ├─INTLApple
│ ├─INTLConfig // Player Network SDK configurations
│ ├─INTLCore // Player Network SDK Core module
│ ├─INTLDiscord
│ ├─INTLEpic
│ ├─INTLFacebook
│ ├─INTLFoundation
│ ├─INTLGoogle
│ ├─INTLKakao
│ ├─INTLLine
│ ├─INTLSteam
│ ├─INTLTwitter
│ └─INTLVK
├─LevelInfinite // LI PASS APIs
└─Symbols // Player Network SDK symbol table *.so files
INTLSDK/Source/INTLCore
└─INTLSDK
├─INTLSDK.uplugin
├─Resources
└─Source
├─INTLConfig
├─INTLCore
| ├─INTLCore.Build.cs // INTLCore Build.cs file
| ├─Libs // INTLCore libraries for different platforms which contain dll, lib, and other binary files.
| | ├─Android
| | ├─include
| | ├─iOS
| | ├─MacOS
| | └─Win
| ├─Private // Player Network SDK private folder
| └─Public // Player Network SDK public interfaces
| // INTLSDKAPI.h: Player Network SDK APIs
| // INTLSDKPluginObserver.h: Player Network SDK observer classes
| // INTLSDKPluginDefine.h: Player Network SDK data types
| // INTLSDKOutputUtility.h: Player Network SDK utility to process callbacks
| // INTLSDKBaseUserWidget.h: Player Network SDK base class for UserWidget which includes registration and deregistration APIs
├─INTLCustomer
├─INTLDiscord
├─INTLEpic
INTLSDK/Source/INTLConfig
└─INTLSDK
├─INTLSDK.uplugin
├─Resources
└─Source
├─INTLConfig
| ├─Configs // Player Network SDK configurations for different platform
| | ├─Android
| | | └─INTLConfig_APL.xml // Player Network SDK Android gradle configuration file
| | ├─iOS
| | | └─INTLConfig_UPL.xml
| | ├─Resources
| | | ├─APASConfig.ini // APAS device level configuration file
| | | └─INTLConfig.ini // Player Network SDK main configuration file
| ├─Encrypt
| ├─INTLConfig.Build.cs
| ├─INTLConfig.uplugin
| ├─Private
| ├─Public
| └─Resources
├─INTLCore

2. 加载所需的权限和插件

注意

如果您的游戏尚未创建 Android 自定义 activity,请参见 Create a custom activity

添加用于加载库和注册 Player Network SDK 生命周期的 Player Network SDK 代码至位于 INTLSDK/Source/INTLCore/Core/AndroidINTLCore_APL.xml(Android 游戏的 Gradle 配置文件)。

载入动态权限

通过代码添加动态权限

INTLCore_APL.xml 中找到 RequestDynamicPermissions() 的函数定义,然后添加需要的动态权限:

private void RequestDynamicPermissions()
{
List<String> permissions = new ArrayList<String>();

permissions.add(Manifest.permission.INTERNET);
//permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); // <--- Add permission here

this.INTLRequestPermission(this, permissions, INTLPermissionRequestCode);
}

异型屏兼容设置

在 Android P 之后,Android 以为异型屏提供标准 API。但对于 Android O 设备,不同供应商存在不同的实现逻辑。Player Network SDK 提供了统一的 C++ API 和 Java API,以支持小米、华为、三星、VIVO 和 OPPO 等不同的 Android O 设备。

对于 Unreal Engine,游戏可使用 UPL 调用 Java API。更多信息,请参见 异步异形屏信息读取

一般上,手机的全屏纵横比大于2.1。为避免黑边,用户必须将 android.max_aspect 修改为2.1以上。
对于使用 Android Oreo 操作系统的华为和小米手机,用户必须配置 AndroidManifest

为了避免在 Unreal Engine 4 中合并 AndroidManifest 时发生冲突,进入 Project Settings > Android > Max Supported Aspect Ratio,将最大支持纵横比设置为2.4。

图片:Android plugin directory

<androidManifestUpdates>
<log text="INTL-Sample-UPL AndroidManifestUpdates finish" />
<addElements tag="application">
<meta-data android:name="notch.config" android:value="portrait|landscape"/>
<meta-data android:name="android.notch_support" android:value="true"/>
</addElements>
</androidManifestUpdates>

对于使用 Android API 获取异型屏安全区域信息的游戏,请添加以下配置:

INTLCore_APL.xml 中添加以下配置。

INTLCore_APL.xml
<gameActivityClassAdditions>
<insert>
// Use the cutout area
private void setFullScreen()
{
Log.debug("INTL::setFullScreen");
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// Set full screen
int systemUiVisibility = this.getWindow().getDecorView().getSystemUiVisibility();
int flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
systemUiVisibility |= flags;
getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);
// P version is allowed to use notch area
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
this.getWindow().setAttributes(lp);
}
}
</insert>
</gameActivityClassAdditions>
<gameActivityOnCreateAdditions>
<insert>
setFullScreen();
INTLSDK.initialize(this);
// ...Other game code
// The following uses Android’s native call method
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
getWindow().getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets)
{
Context mContext = getApplicationContext();
DisplayCutoutManager displayCutoutManager = Singleton.getSingleton(DisplayCutoutManager.class);
// Whether the device has a notched display
if (displayCutoutManager.hasCutoutSupport(mContext, insets))
{
// Get notched display safe areas
Rect safeRect = displayCutoutManager.getSafeDisplay(mContext, insets);
// Get notched display notch area
List<Rect> rects = displayCutoutManager.getCutoutSize(mContext, insets);
// Game business logic, can use native call to pass notched display information
}
return insets;
}
});
}
</insert>
</gameActivityOnCreateAdditions>

3. 生成 AAR 包

Player Network SDK 使用 Gradle 生成 AAR 包。Gradle 配置文件包括第三方 SDK 版本号以及 Player Network SDK 和第三方渠道所需的依赖项。游戏需要根据所需的插件添加必要的依赖项。

INTLConfig_APL.xml 文件是 Player Network SDK Gradle 配置文件。根据游戏需求更新 Gradle 配置。用 INTLConfig.ini 配置文件中的值替换 {placeholder} 文本。

<?xml version="1.0" encoding="utf-8"?>

<root xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<init>
<log text="INTLConfig-APL init"/>
</init>

<prebuildCopies>
<log text="INTLConfig-APL Start prebuildCopies ...$S(PluginDir)" />
</prebuildCopies>

<resourceCopies>
<log text="INTLConfig-APL Start resourceCopies...$S(PluginDir)" />
<copyFile src="$S(PluginDir)/../Resources/APASConfig.ini" dst="$S(BuildDir)/assets/APASConfig.ini"/>
<log text="INTLConfig-APL copy APASConfig.ini from $S(PluginDir) to $S(BuildDir) end" />

<setBoolFromProperty result="bEncrypted" ini="Engine" section="/Script/INTLSDK.Settings" property="bEnableConfigIniEncryption" default="false"/>
<if condition="bEncrypted">
<true>
<copyFile src="$S(PluginDir)/../Encrypted/Android/INTLConfig.ini.new" dst="$S(BuildDir)/assets/INTLConfig.ini.new"/>
</true>
<false>
<copyFile src="$S(PluginDir)/../Resources/INTLConfig.ini" dst="$S(BuildDir)/assets/INTLConfig.ini"/>
</false>
</if>
<log text="INTLConfig-APL copy INTLConfig.ini from $S(PluginDir) to $S(BuildDir) end" />
</resourceCopies>


<buildGradleAdditions>
<insert>
<![CDATA[
android{

defaultConfig {
manifestPlaceholders += [
"FACEBOOK_APPID" : "{INTL_FACEBOOK_APP_ID}",
"FACEBOOK_CLIENT_TOKEN" : "{INTL_FACEBOOK_CLIENT_TOKEN}",
"GOOGLE_APPID" : '{INTL_GOOGLE_APP_ID}',
'GOOGLEPGS_APPID' : '{INTL_GOOGLEPGS_APPID}',
'VK_APPID' : '{INTL_VK_APP_ID}',
'GARENA_APP_ID' : '{INTL_GARENA_APP_SDK_ASSIGN_ID}',
'QQ_APPID' : '{INTL_QQ_APP_ID}',
'GOOGLE_CLIENT_ID' : '{INTL_GOOGLE_CLIENT_KEY_ANDROID}',
'DISCORD_APP_ID' : '{INTL_DISCORD_APP_ID}',
'DISCORD_REDIRECT_SCHEME' : '{INTL_DISCORD_REDIRECT_SCHEME}',
'DISCORD_REDIRECT_HOST' : '{INTL_DISCORD_REDIRECT_HOST}',
'DISCORD_REDIRECT_PATH' : '{INTL_DISCORD_REDIRECT_PATH}',
'DMM_LOGIN_ACTIVITY_DATA_SCHEME': '{INTL_DMM_LOGIN_ACTIVITY_DATA_SCHEME}',
'KAKAO_APP_SECRET' : '{INTL_KAKAO_APP_SECRET}',
'KAKAO_APP_ID' : '{INTL_KAKAO_APP_ID}',
'DEEPLINK_INTL_SCHEME' : '{INTL_DEEPLINK_INTL_SCHEME}',
'VNG_GG_APP_ID' : '{INTL_VNG_GG_APP_ID}',
'VNG_GG_CLIENT_TOKEN' : '{INTL_VNG_GG_CLIENT_TOKEN}',
]
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
]]>
</insert>
</buildGradleAdditions>

</root>

4. Player Network SDK 配置

注意

手动修改 INTLConfig.ini 配置时,请联系 Player Network 助手确认内容变更是否符合预期,详见 SDK Config Information

请按照 INTLConfig.ini 的说明进行相应配置。

5. 初始化 Player Network SDK

在集成第三方渠道之前,必须先初始化 Player Network SDK。更多详情,请参见 初始化 SDK

UINTLSDKAPI::Init();

步骤2:验证 Player Network SDK 接入成功

  1. 修改 INTLConfig.ini 文件中 INTL Log 节点下的配置。
[INTL Log]
LOG_LEVEL = 1
LOG_ENCRYPT_ENABLE = 0
LOG_COMPRESS_ENABLE = 0
LOG_CONSOLE_OUTPUT_ENABLE = 1
LOG_FILE_OUTPUT_ENABLE = 1
  1. 运行程序,当日志中显示 Init INTL SDK success. 时,表示接入成功。

推荐使用

您已完成 Player Network SDK 的接入,并可开始为您的项目编写程序。

我们建议使用以下 Player Network 的服务:

  • 參考 登录鉴权 教程,为您的项目添加第三方渠道登录。
  • 查看有关 社交 服务的更多信息,了解如何促进玩家之间的互动。
  • 有关配置公告和推送通知的详细步骤,请参见 玩家参与
  • 查看 数据洞察 服务的相关文档,了解如何收集和上报数据。
  • 通过 Player Network 提供的 Deep Link、WebView 等 实用工具,增强 Player Network 服务体验。
  • 根据您的发行国家/地区,为您的项目制定 合规保障 方案。

除此之外,您也可以选择接入 LEVEL INFINITE PASS,接入后便可使用上述所有功能。
一般用户可通过简单快捷的流程实现适用于大部分游戏的标准解决方案,而希望定制项目的各种细节的用户也可省去不必要的集成动作,直接开始配置。

更多详情,请联系 Player Network 助手进行咨询。