跳到主要内容

Android SDK 高级使用场景

1. 设置游戏区域半屏​

宿主 SDK 提供了接口 getGameView() 用于获取游戏 View,可以通过限制游戏 View 外部容器大小的方式,改变游戏区域大小与位置。例如某个包含游戏容器的布局示例如下,非游戏部分占据顶部 200 dp 高度区域:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
android:id="@+id/nonGamingArea"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/text_light_grey">
</LinearLayout>

<FrameLayout
android:id="@+id/gameContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

在调用 TJHostHandle.initialize() 时,可传入 gameContainer 以限制加载页区域,例如:

TJHostHandle.initialize(context, p.getProperty("app.key"), p.getProperty("app.secret"), gameContainer, new OnTJHostHandleInitializeListener() {
// ...
});

在 hostHandle.start() 成功后,可通过 getGameView() 获取游戏 View,并将其添加到 gameContainer 中以限制游戏区域:

hostHandle.start("[Demo App]", new OnTJHostHandleListener() {
@Override
public void onSuccess() {
gameContainer.addView(hostHandle.getGameView());
hostHandle.getGameView().requestFocus();

playGame();
}

@Override
public void onFailure(Throwable throwable) {
// ...
}
});

效果示意图如下:

半屏加载页半屏游戏
半屏加载页半屏游戏

2. 支持透明游戏背景​

可在 setGameStartOption() 时设置参数 ENABLE_TRANSPARENT_MODE 为 true,可使得 GameView 背景支持透明:

bundle.putBoolean(TJConstants.ENABLE_TRANSPARENT_MODE, true);

此时在 gameContainer 中增加一个 TextView 充当背景:

<FrameLayout
android:id="@+id/gameContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_margin="40dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:background="@color/text_light_grey"
android:text="@string/gaming_area_background"
android:textSize="16sp"
android:textColor="@color/black">
</TextView>
</FrameLayout>

运行透明背景的游戏,如 Demo 中的透明背景测试游戏,实际效果如下

透明背景测试游戏

3. 自定义胶囊按钮​

自定义胶囊按钮可通过不显示默认胶囊按钮并实现一个自定义的按钮实现。在 setGameStartOption() 时设置参数 SHOW_MENU_LAYOUT 为 false,可隐藏默认胶囊按钮。

bundle.putBoolean(TJConstants.SHOW_MENU_LAYOUT, false);

此后并在 gameContainer 内添加一个自定义 Button ,实现点击逻辑即可:

<FrameLayout
android:id="@+id/gameContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/diy_button"
android:layout_gravity="end|top"
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp">
</Button>
</FrameLayout>

实际效果如下:

自定义胶囊按钮加载页自定义胶囊按钮游戏界面
自定义胶囊按钮加载页自定义胶囊按钮游戏界面

上述方式适用于添加任何自定义 View 到加载页和游戏界面,如果仅想在游戏界面内添加一个自定义 View 浮在游戏上方,可参考添加平台 UI 层子视图

4. Java 与 JS 相互调用​

可参考 CustomCommand API 说明

5. 最近游玩列表​

Host SDK 提供了最近游玩相关的接口,用于查询当前用户的游玩列表,或注入自定义的 HistorySaver 以在外部处理和存储启动游戏历史信息 HistoryModel。

通过 API 直接获取用户游玩历史列表​

如果需要获取某用户的最近游玩列表,可调用如下接口,此处的 userId 与启动游戏时传入的 USER_ID 一致:

public static List<HistoryModel> getUserHistory(Context context, String userId)

// e.g. List<HistoryModel> historyList = TJHostHandle.getUserHistory(context, "user_id");

HistoryModel 字段说明如下

字段数据类型说明
idString游戏 ID
userIdString用户 ID
versionIdString游戏版本 ID
nameString游戏名称
gameTypeString游戏类型
iconUrlString游戏图标地址
tags[String]游戏标签
briefIntroString游戏简介
launchKeyString游戏启动参数
devBool是否是扫码启动的测试包
lastLaunchTimeInt64游戏最后启动时间

dev 字段说明​

MiniHost 控制台在游戏包管理中提供了扫码体验的功能。扫码体验的游戏作为开发版临时体验游玩,因此游戏包的下载地址是一个临时地址。

因为游戏启动后会被记录进最近游玩列表,而开发包的下载地址是临时的,所以当从最近游玩中启动扫码体验的开发包时,游戏只会启动本地缓存的游戏包,并不会重新下载。

当游戏版本更新时,需扫描新的二维码下载游戏包,此时游戏列表会更新 launchKey 替换原有的版本作为下次启动参数。

注入 HistorySaver 处理游玩历史​

也可以通过注入自定义 HistorySaver 的方式来处理和存储启动游戏历史信息,可通过如下 API 注入。需要注意注入操作应当在 createGameHandle 成功后,并在 setGameStartOption 前:

public void setHistorySaver(HistorySaver saver)

public interface HistorySaver {
void save(HistoryModel history);
}

例如可参考 Demo 源码自行实现一个 DemoHistorySaver,将 HistoryModel 上传至后端保存以实现跨设备存储功能 :

public class DemoHistorySaver implements HistorySaver {
// ...
@Override
public void save(HistoryModel historyModel) {
// You can upload the history info to your server here, we just simply save it to SharedPreference for example
try {
historyService.requestSaveHistory(gson.toJson(historyModel));
} catch (RemoteException e) {
Log.e(TAG, "requestSaveHistory failed: " + e.getMessage());
}
}

// ...
}

// 在 createGameHandle 后注入 HistorySaver
private void injectHistorySaver() {
historySaver = new DemoHistorySaver(this);
hostHandle.setHistorySaver(historySaver);
}

Demo 中历史记录获取与展示效果如下:

历史记录