Gamebaseで対応している付加機能について説明します。
API
+ (String)Gamebase.getDeviceLanguageCode();
メンテナンスポップアップなどでGamebaseが表示する言語は、端末に設定された言語と同じです。
しかしゲームで表示する言語を、端末に設定した言語ではなく、別のオプションで変更できるゲームがあります。 例えば、端末に設定された言語は英語ですが、ゲーム表示言語を日本語に変更した場合、 Gamebaseで表示する言語も日本語に変更したいですが、Gamebaseが表示する言語は端末に設定された言語の英語が表示されます。
このように端末に設定された言語ではなく、他の言語でGamebaseのメッセージを表示したいアプリケーションのためにGamebaseはDisplay Languageという機能を提供します。
GamebaseはDisplay Languageで設定した言語でGamebaseのメッセージを表示します。 Display Languageに入力する言語コードは、以下の表(Gamebaseでサポートする言語コードの種類)で指定したコードだけを使用できます。
[注意]
- Display Languageは、端末設定言語と関係なくGamebaseの表示言語を変更したい場合にのみ使用してください。
- Display Language CodeはISO-639形式の値で、大文字/小文字を区別します。 'EN'または'zh-cn'と設定すると問題が発生する場合があります。
- もしDisplay Language Codeに入力した値が以下の表(Gamebaseでサポートする言語コードの種類)に存在しない場合、Display Langauge CodeはGamebaseコンソールで設定したデフォルト言語に指定されます。
- もしGamebaseコンソールで言語設定を行っていなければ英語(en)がデフォルト言語に設定されます。
[参考]
- Gamebaseのクライアントに含まれていない言語セットは直接追加できます。 新規言語セット追加項目を参照してください。
| Code | Name |
|---|---|
| de | German |
| en | English |
| es | Spanish |
| fi | Finnish |
| fr | French |
| id | Indonesian |
| it | Italian |
| ja | Japanese |
| ko | Korean |
| pt | Portuguese |
| ru | Russian |
| th | Thai |
| vi | Vietnamese |
| ms | Malay |
| zh-CN | Chinese-Simplified |
| zh-TW | Chinese-Traditional |
該当する言語コードは、「DisplayLanguage」クラスに定義されています。
package com.toast.android.gamebase.base.ui;
public class DisplayLanguage {
public static class Code {
public static final String German = "de";
public static final String English = "en";
public static final String Spanish = "es";
public static final String Finnish = "fi";
public static final String French = "fr";
public static final String Indonesian = "id";
public static final String Italian = "it";
public static final String Japanese = "ja";
public static final String Korean = "ko";
public static final String Portuguese = "pt";
public static final String Russian = "ru";
public static final String Thai = "th";
public static final String Vietnamese = "vi";
public static final String Malay = "ms";
public static final String Chinese_Simplified = "zh-CN";
public static final String Chinese_Traditional = "zh-TW";
}
...
}
Gamebaseを初期化する際のDisplay Languageを設定することができます。
API
+ (GamebaseConfiguration)GamebaseConfiguration.Builder.setDisplayLanguageCode(String displayLanguageCode);
Example
public class MainActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String appId = "T0aStC1d";
String appVersion = "1.0.0";
GamebaseConfiguration configuration = new GamebaseConfiguration.Builder(appId, appVersion)
.enableLaunchingStatusPopup(true)
.setDisplayLanguageCode(DisplayLanguage.Code.English)
.build();
Gamebase.initialize(activity, configuration, new GamebaseDataCallback<LaunchingInfo>() {
@Override
public void onCallback(final LaunchingInfo data, GamebaseException exception) {
...
}
});
...
}
...
}
Gamebaseを初期化する際に入力されたDisplay Languageを変更することができます。
API
+ (void)Gamebase.setDisplayLanguageCode(String displayLanguageCode);
Example
public void setDisplayLanguageCodeToEnglishInRuntime() {
Gamebase.setDisplayLanguageCode(DisplayLanguage.Code.English);
}
現在適用されているDisplay Languageを照会することができます。
API
+ (String)Gamebase.getDisplayLanguageCode();
Example
public void getDisplayLanguageCodeInRuntime() {
String currentDisplayLanguageCode = Gamebase.getDisplayLanguageCode();
}
Gamebaseで提供するデフォルト言語(ko、en、ja、zh-CN、zh-TW、th)以外の言語を追加したい場合は、プロジェクトのres > rawフォルダにlocalizedstring.jsonファイルを追加してください。

localizedstring.jsonに定義されている形式は、次の通りです。
{
"en": {
"common_ok_button": "OK",
"common_cancel_button": "Cancel",
...
"launching_service_closed_title": "Service Closed"
},
"ko": {
"common_ok_button": "확인",
"common_cancel_button": "취소",
...
"launching_service_closed_title": "서비스 종료"
},
"ja": {
"common_ok_button": "確認",
"common_cancel_button": "キャンセル",
...
"launching_service_closed_title": "サービス終了"
},
"zh-CN": {
"common_ok_button": "确定",
"common_cancel_button": "取消",
...
"launching_service_closed_title": "关闭服务"
},
"zh-TW": {
"common_ok_button": "好",
"common_cancel_button": "取消",
...
"launching_service_closed_title": "服務關閉"
},
"th": {
"common_ok_button": "ยืนยัน",
"common_cancel_button": "ยกเลิก",
...
"launching_service_closed_title": "ปิดให้บริการ"
},
"de": {},
"es": {},
...
"ms": {}
}
他の言語の追加が必要な場合は、localizedstring.jsonファイルの該当言語コードに"key":"value"形式で値を追加してください。
{
"en": {
"common_ok_button": "OK",
"common_cancel_button": "Cancel",
...
"launching_service_closed_title": "Service Closed"
},
...
"vi": {
"common_ok_button": "value",
"common_cancel_button": "value",
...
"launching_service_closed_title": "value"
},
...
"ms": {}
}
初期化及びSetDisplayLanguageCodeAPIを通してDisplay Languageを設定する場合、最終的に適用されるDisplay Languageは、入力した値と違う値が適用されることがあります。
enがデフォルト値に設定されます。API
+ (String)Gamebase.getCountryCodeOfUSIM()
API
+ (String)Gamebase.getCountryCodeOfDevice()

API
+ (String)Gamebase.getCountryCode()
API
+ (void)Gamebase.addEventHandler(GamebaseEventHandler handler);
+ (void)Gamebase.removeEventHandler(GamebaseEventHandler handler);
+ (void)Gamebase.removeAllEventHandler();
VO
class GamebaseEventMessage {
// Eventの種類を表します。
// GamebaseEventCategoryクラスの値が割り当てられます。
@NonNull
final public String category;
// 各categoryに合ったVOに変換できるJSON Stringデータです。
@Nullable
final public String data;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.LOGGED_OUT:
GamebaseEventLoggedOutData loggedOutData = GamebaseEventLoggedOutData.from(message.data);
if (loggedOutData != null) {
processLoggedOut(activity, message.category, loggedOutData);
}
break;
case GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT_MESSAGE_RECEIVED:
case GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT:
case GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT:
GamebaseEventServerPushData serverPushData = GamebaseEventServerPushData.from(message.data);
if (serverPushData != null) {
processServerPush(activity, message.category, serverPushData);
}
break;
case GamebaseEventCategory.OBSERVER_LAUNCHING:
case GamebaseEventCategory.OBSERVER_HEARTBEAT:
case GamebaseEventCategory.OBSERVER_NETWORK:
GamebaseEventObserverData observerData = GamebaseEventObserverData.from(message.data);
if (observerData != null) {
processObserver(activity, message.category, observerData);
}
break;
case GamebaseEventCategory.PURCHASE_UPDATED:
...
case GamebaseEventCategory.PUSH_RECEIVED_MESSAGE:
...
case GamebaseEventCategory.PUSH_CLICK_MESSAGE:
...
case GamebaseEventCategory.PUSH_CLICK_ACTION:
...
default:
...
}
}
});
}
| Event種類 | GamebaseEventCategory | VO変換方法 | 備考 |
|---|---|---|---|
| LoggedOut | GamebaseEventCategory.LOGGED_OUT | GamebaseEventLoggedOutData.from(message.data) | - |
| ServerPush | GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT_MESSAGE_RECEIVED GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT |
GamebaseEventServerPushData.from(message.data) | - |
| Observer | GamebaseEventCategory.OBSERVER_LAUNCHING GamebaseEventCategory.OBSERVER_NETWORK GamebaseEventCategory.OBSERVER_HEARTBEAT |
GamebaseEventObserverData.from(message.data) | - |
| Purchase - プロモーション決済 | GamebaseEventCategory.PURCHASE_UPDATED | PurchasableReceipt.from(message.data) | - |
| Push - メッセージ受信 | GamebaseEventCategory.PUSH_RECEIVED_MESSAGE | PushMessage.from(message.data) | isForeground値を使用してForegroundでメッセージを受信したかどうかを確認できます。 |
| Push - メッセージクリック | GamebaseEventCategory.PUSH_CLICK_MESSAGE | PushMessage.from(message.data) | isForeground値がありません。 |
| Push - アクションクリック | GamebaseEventCategory.PUSH_CLICK_ACTION | PushAction.from(message.data) | RichMessageボタンを押すと動作します。 |
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
// ...
}
});
// ...
}
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.LOGGED_OUT:
GamebaseEventLoggedOutData loggedOutData = GamebaseEventLoggedOutData.from(message.data);
if (loggedOutData != null) {
processLoggedOut(activity, message.category, loggedOutData);
}
break;
default:
...
}
}
});
}
void processLoggedOut(String category, GamebaseEventLoggedOutData data) {
if (category.equals(GamebaseEventCategory.LOGGED_OUT)) {
// There was a problem with the access token.
// Call login again.
Gamebase.login(activity, Gamebase.getLastLoggedInProvider(), (authToken, exception) -> {});
}
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT_MESSAGE_RECEIVED:
case GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT:
case GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT:
GamebaseEventServerPushData serverPushData = GamebaseEventServerPushData.from(message.data);
if (serverPushData != null) {
processServerPush(activity, message.category, serverPushData);
}
break;
default:
...
}
}
});
}
void processServerPush(String category, GamebaseEventServerPushData data) {
if (category.equals(GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT_MESSAGE_RECEIVED)) {
// Currently, the kickout pop-up is displayed.
// If your game is running, stop it.
} else if (category.equals(GamebaseEventCategory.SERVER_PUSH_APP_KICKOUT)) {
// Kicked out from Gamebase server.(Maintenance, banned or etc..)
// And the game user closes the kickout pop-up.
// Return to title and initialize Gamebase again.
} else if (category.equals(GamebaseEventCategory.SERVER_PUSH_TRANSFER_KICKOUT)) {
// If the user wants to move the guest account to another device,
// if the account transfer is successful,
// the login of the previous device is released,
// so go back to the title and try to log in again.
}
}
VO
class GamebaseEventObserverData {
// 状態値を表す情報です。
public int code;
// 状態に関連するメッセージ情報です。
@Nullable
public String message;
// 追加情報用の予備フィールドです。
@Nullable
public String extras;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.OBSERVER_LAUNCHING:
case GamebaseEventCategory.OBSERVER_HEARTBEAT:
case GamebaseEventCategory.OBSERVER_NETWORK:
GamebaseEventObserverData observerData = GamebaseEventObserverData.from(message.data);
if (observerData != null) {
processObserver(activity, message.category, observerData);
}
break;
default:
...
}
}
});
}
void processObserver(String category, GamebaseEventObserverData data) {
if (category.equals(GamebaseEventCategory.OBSERVER_LAUNCHING)) {
int launchingStatusCode = data.code;
String launchingMessage = data.message;
switch (launchingStatusCode) {
case LaunchingStatus.IN_SERVICE:
// Finished maintenance.
break;
case LaunchingStatus.INSPECTING_SERVICE:
case LaunchingStatus.INSPECTING_ALL_SERVICES:
// Under maintenance.
break;
...
}
} else if (category.equals(GamebaseEventCategory.OBSERVER_HEARTBEAT)) {
int errorCode = data.code;
switch (errorCode) {
case GamebaseError.INVALID_MEMBER:
// You can check the invalid user session in here.
// ex) After transferred account to another device.
break;
case GamebaseError.BANNED_MEMBER:
// You can check the banned user session in here.
break;
case GamebaseError.AUTH_TOKEN_LOGIN_INVALID_TOKEN_INFO:
// There was a problem with the access token.
// Call login again.
Gamebase.login(activity, Gamebase.getLastLoggedInProvider(), (authToken, exception) -> {});
break;
}
} else if (category.equals(GamebaseEventCategory.OBSERVER_NETWORK)) {
int networkTypeCode = data.code;
// You can check the changed network status in here.
if (networkTypeCode == NetworkManager.TYPE_NOT) {
// Network disconnected.
} else {
// Network connected.
}
}
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PURCHASE_UPDATED:
PurchasableReceipt receipt = PurchasableReceipt.from(message.data);
if (receipt != null) {
// If the user got item by 'Promotion Code',
// this event will be occurred.
}
break;
default:
...
}
}
});
}
VO
class PushMessage {
// メッセージ固有のidです。
@NonNull
public String id;
// Pushメッセージのタイトルです。
@Nullable
public String title;
// Pushメッセージの本文です。
@Nullable
public String body;
// JSONObjectに変換してすべての情報を確認できます。
@NonNull
public String extras;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PUSH_RECEIVED_MESSAGE:
PushMessage pushMessage = PushMessage.from(message.data);
if (pushMessage != null) {
// When you received push message.
try {
JSONObject json = new JSONObject(pushMessage.extras);
// There is 'isForeground' information.
boolean isForeground = json.getBoolean("isForeground");
Object customValue = json.get("YourCustomKey");
} catch (Exception e) {}
}
break;
default:
...
}
}
});
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PUSH_CLICK_MESSAGE:
PushMessage clickedMessage = PushMessage.from(message.data);
if (clickedMessage != null) {
// When you clicked push message.
}
break;
default:
...
}
}
});
}
VO
class PushAction {
// ボタンアクションの種類です。
@NonNull
public String actionType;
// PushMessageデータです。
@NonNull
public PushMessage message;
// Pushコンソールで入力したユーザーテキストです。
@Nullable
public String userText;
}
Example
void eventHandlerSample(Activity activity) {
Gamebase.addEventHandler(new GamebaseEventHandler() {
@Override
public void onReceive(@NonNull GamebaseEventMessage message) {
switch (message.category) {
case GamebaseEventCategory.PUSH_CLICK_ACTION:
PushAction pushAction = PushAction.from(message.data);
if (pushAction != null) {
// When you clicked action button by 'Rich Message'.
}
break;
default:
...
}
}
});
}
ゲーム指標をGamebase Serverに伝送できます。
[注意]
Gamebase AnalyticsでサポートするすべてのAPIは、ログイン後に呼び出すことができます。
[TIP]
Gamebase.Purchase.requestPurchase() APIを呼び出し、決済が完了すると、自動的に指標を伝送します。
ゲームログイン後、ユーザーレベル情報を設定できます。
[注意]
ゲームログイン後にsetGameUserData APIを呼び出さない場合、他の指標でレベル情報が抜ける場合があります。
APIの呼び出しに必要なパラメータは下記の通りです。
GameUserData
| Name | Mandatory(M) / Optional(O) | type | Desc |
|---|---|---|---|
| userLevel | M | int | ユーザーレベルを表すフィールドです。 |
| channelId | O | String | チャンネルを表すフィールドです。 |
| characterId | O | String | キャラクター名を表すフィールドです。 |
| classId | O | String | 職業を表すフィールドです。 |
API
Gamebase.Analytics.setGameUserData(GameUserData gameUserData);
Example
public void onLoginSuccess() {
int userLevel = 10;
String channelId, characterId, classId;
GameUserData gameUserData = new GameUserData(userLevel);
gameUserData.channelId = channelId; // Optional
gameUserData.characterId = characterId; // Optional
gameUserData.classId = classId; // Optional
Gamebase.Analytics.setGameUserData(gameUserData);
}
レベルアップすると、ユーザーレベル情報を変更できます。
APIの呼び出しに必要なパラメータは、下記の通りです。
LevelUpData
| Name | Mandatory(M) / Optional(O) | type | Desc |
|---|---|---|---|
| userLevel | M | int | ユーザーレベルを表すフィールドです。 |
| levelUpTime | M | long | Epoch Timeで入力します。Millisecond単位で入力します。 |
API
Gamebase.Analytics.traceLevelUp(LevelUpData levelUpData);
Example
public void onLevelUp(int userLevel, long levelUpTime) {
LevelUpData levelUpData = new LevelUpData(userLevel, levelUpTime);
Gamebase.Analytics.traceLevelUp(levelUpData);
}
Gamebaseでは顧客からの問い合わせに対応するための機能を提供します。
[TIP]
NHN Cloud Contactサービスと連携して使用すると、簡単に顧客からの問い合わせに対応できます。 詳細はNHN Cloud Contactサービスの利用ガイドを参照してください。 NHN Cloud Online Contact Guide
[注意]
- Gamebase Android SDK 2.53.0以降のバージョンは、下記のガイドに従ってAndroidManifest.xmlに権限宣言を追加するだけで、サポートにファイルを添付する際、Gamebase Android SDKが自動的に権限を要求します。
- Gamebase Android SDK 2.52.0以下のバージョンは、プラットフォーム別ガイドを参考にして直接権限取得処理を実装する必要があります。
Gamebase コンソール > App > Customer serviceでは、次のように3つのタイプのサポートを選択できます。

| Customer Service Type | Required Login |
|---|---|
| Developer customer center | X |
| Gamebase customer center | △ |
| NHN Cloud Online Contact | △ |
タイプに応じてGamebase SDKのサポートAPIは次のURLを使用します。
サポートWebビューを表示します。 URLはサポートタイプに基づいて決定されます。 ContactConfigurationでURLに追加情報を伝達できます。
ContactConfiguration
| API | Mandatory(M) / Optional(O) | Description |
|---|---|---|
| newBuilder() | M | ContactConfigurationオブジェクトはnewBuilder()関数で作成できます。 |
| build() | M | 設定を終えたBuilderをConfigurationオブジェクトに変換します。 |
| setUserName(String userName) | O | ユーザー名(ニックネーム)を伝達したい時に使用します。 NHN Cloud組織商品(Online Contact)タイプで使用するフィールドです。 default : null |
| setAdditionalURL(String additionalURL) | O | 開発会社の独自サポートURLの後ろにつく追加のURLです。 サポートタイプが CUSTOMの場合にのみ使用してください。default : null |
| setAdditionalParameters(Map<String, String> additionalParameters) | O | サポートセンターURLの後ろにつく追加のパラメータです。 default : null |
| setExtraData(Map<String, Object> extraData) | O | 任意のextra dataをサポートのオープン時に伝達します。 default : EmptyMap |
API
+ (void)Gamebase.Contact.openContact(@NonNull final Activity activity,
@Nullable final GamebaseCallback onCloseCallback);
+ (void)Gamebase.Contact.openContact(@NonNull final Activity activity,
@NonNull final ContactConfiguration configuration,
@Nullable final GamebaseCallback onCloseCallback);
ErrorCode
| Error Code | Description |
|---|---|
| NOT_INITIALIZED(1) | Gamebase.initializeが呼び出されませんでした。 |
| UI_CONTACT_FAIL_INVALID_URL(6911) | サポートURLが存在しません。 GamebaseコンソールのサポートURLを確認してください。 |
| UI_CONTACT_FAIL_ISSUE_SHORT_TERM_TICKET(6912) | ユーザーを識別するための臨時チケットの発行に失敗しました。 |
| UI_CONTACT_FAIL_ANDROID_DUPLICATED_VIEW(6913) | サポートWebビューがすでに表示中です。 |
Example
Gamebase.Contact.openContact(activity, new GamebaseCallback() {
@Override
public void onCallback(GamebaseException exception) {
if (Gamebase.isSuccess(exception)) {
// A user close the contact web view.
} else if (exception.code == UI_CONTACT_FAIL_INVALID_URL) { // 6911
// TODO: Gamebase Console Service Center URL is invalid.
// Please check the url field in the TOAST Gamebase Console.
} else if (exception.code == UI_CONTACT_FAIL_ANDROID_DUPLICATED_VIEW) { // 6913
// The customer center web view is already opened.
} else {
// An error occur when opening the contact web view.
}
}
});
サポートのWebビューを表示するのに使用されるURLを返します。
API
+ (void)Gamebase.Contact.requestContactURL(@NonNull final GamebaseDataCallback<String> callback);
+ (void)Gamebase.Contact.requestContactURL(@NonNull final ContactConfiguration configuration,
@NonNull final GamebaseDataCallback<String> callback);
ErrorCode
| Error Code | Description |
|---|---|
| NOT_INITIALIZED(1) | Gamebase.initializeが呼び出されませんでした。 |
| UI_CONTACT_FAIL_INVALID_URL(6911) | サポートURLが存在しません。 GamebaseコンソールのサポートURLを確認してください。 |
| UI_CONTACT_FAIL_ISSUE_SHORT_TERM_TICKET(6912) | ユーザーを識別するための臨時チケットの発行に失敗しました。 |
Example
ContactConfiguration configuration = ContactConfiguration.newBuilder()
.setUserName(userName)
.build();
Gamebase.Contact.requestContactURL(configuration, new GamebaseDataCallback<String>() {
@Override
public void onCallback(String contactUrl, GamebaseException exception) {
if (Gamebase.isSuccess(exception)) {
// Open webview with 'contactUrl'
} else if (exception.code == UI_CONTACT_FAIL_INVALID_URL) { // 6911
// TODO: Gamebase Console Service Center URL is invalid.
// Please check the url field in the TOAST Gamebase Console.
} else {
// An error occur when requesting the contact web view url.
}
}
});
サポートのタイプが「NHN Cloud組織商品」の場合、「追加パラメータ」項目のKeyにfrom、Valueにappを入力すると、ファイル添付時のタイプ選択ポップアップが表示されます。

Texas SB 2420及び類似する州の法律は、未成年者の保護のためにアプリでユーザーの年齢確認を求めています。 Gamebaseは、Google Play Age Signals APIをラッピングし、このような要件を満たすAPIを提供します。
SDK内部的に以下の依存関係を持っています。
implementation 'com.google.android.play:age-signals'
詳細はhttps://developer.android.com/google/play/age-signalsを参照してください。
[注意]
Play Age Signals API (ベータ)は、2026年1月1日まで例外を発生させます。1月1日からAPIはリアルタイムレスポンスを返します。
Gamebase.AgeSignals.checkAgeSignals(Context, GamebaseAgeSignalsRequest)を呼び出し、年齢情報を確認します。
GamebaseAgeSignalsRequest
| API | Mandatory(M) / Optional(O) | Description |
|---|---|---|
| newBuilder() | M | GamebaseAgeSignalsRequestオブジェクトは、newBuilder()関数を通じて生成できます。 |
| build() | M | 設定を終えたBuilderをRequestオブジェクトに変換します。 |
API
+ (void)Gamebase.AgeSignals.checkAgeSignals(@NonNull Context context,
@NonNull GamebaseAgeSignalsRequest request,
@NonNull GamebaseDataCallback<GamebaseAgeSignalsResult> callback)
ErrorCode
| Error Code | Description |
|---|---|
| NOT_SUPPORTED(10) | Android API 23未満のデバイスで呼び出されました。 |
| AUTH_EXTERNAL_LIBRARY_ERROR(3009) | Google Play Age Signals APIでエラーを返しました。 |
Example
// Age Signalsリクエスト生成
val request = GamebaseAgeSignalsRequest.newbuilder().build()
// Age Signals確認リクエスト
Gamebase.AgeSignals.checkAgeSignals(context, request) { result, exception ->
if (Gamebase.isSuccess(exception)) {
// 成功: 年齢確認情報処理
handleAgeSignalsResult(result)
} else {
// 失敗: エラー処理
val errorCode = exception?.code
val errorMessage = exception?.message
when (errorCode) {
GamebaseError.NOT_SUPPORTED -> {
// Android API 23未満のデバイスではサポートされません。
Log.e(TAG, "Age Signals API is not supported on this device")
}
GamebaseError.AUTH_EXTERNAL_LIBRARY_ERROR -> {
// Google Playサービスでエラーが発生しました。
Log.e(TAG, "Google Play Age Signals error: $errorMessage")
}
}
}
}
GamebaseAgeSignalsResult.userStatus()でユーザーの状態を確認できます。 Status値に従ってユーザー規制の有無を判断してください。
GamebaseAgeSignalsVerificationStatus
ユーザー検証状態定数です。
| Status | Code | Description |
|---|---|---|
| VERIFIED | 0 | 18歳以上の成人 |
| SUPERVISED | 1 | 保護者の同意がある未成年者 |
| SUPERVISED_APPROVAL_PENDING | 2 | 保護者承認待機中 |
| SUPERVISED_APPROVAL_DENIED | 3 | 保護者承認拒否済み |
| UNKNOWN | 4 | 検証されていないユーザー |
Example
private fun handleAgeSignalsResult(result: GamebaseAgeSignalsResult) {
val userStatus = result.userStatus()
if (userStatus == null) {
// ユーザーが規制地域(テキサス、ユタ、ルイジアナ)にいないことを意味します。
// 規制対象ではないユーザーに対するアプリのロジックを進行できます。
return
}
when (userStatus) {
GamebaseAgeSignalsVerificationStatus.VERIFIED -> {
// 18歳以上の成人ユーザー
// 全ての機能に対するアクセス許可
// ageLowerとageUpperはnullです
handleAdultUser(result)
}
GamebaseAgeSignalsVerificationStatus.SUPERVISED -> {
// 保護者の同意がある未成年者
// Texas SB 2420に従い未成年者のための制限された機能を提供
// 年齢帯を確認できます。
val ageLower = result.ageLower() // 例: 13
val ageUpper = result.ageUpper() // 例: 17
val installId = result.installId()
handleSupervisedMinor(result)
}
GamebaseAgeSignalsVerificationStatus.SUPERVISED_APPROVAL_PENDING -> {
// 保護者の承認を待つ間、制限された機能のみ提供
// ユーザーに承認待機中であることを通知
handleApprovalPending(result)
}
GamebaseAgeSignalsVerificationStatus.SUPERVISED_APPROVAL_DENIED -> {
// 保護者が承認を拒否した場合
// 制限された機能のみ提供するか、サービス利用不可を案内
handleApprovalDenied(result)
}
GamebaseAgeSignalsVerificationStatus.UNKNOWN -> {
// 該当管轄地域で検証されていないユーザーまたは年齢確認情報を使用できない場合
// ユーザーにPlayストアを訪問して状態を解決するようにリクエストしてください。
handleUnknownUser(result)
}
else -> {
// このケースをロギングして潜在的な未来の状態に対しても柔軟に処理できるようにします。
}
}
}
GamebaseAgeSignalsResult
詳細はhttps://developer.android.com/google/play/age-signals/use-age-signals-api#age-signals-responsesを参照してください。