---
title: "안드로이드 SDK"
slug: "game-gamepotandroid"
updated: 2026-09-17T09:07:47Z
published: 2026-09-17T09:07:47Z
canonical: "guide.ncloud-docs.com/game-gamepotandroid"
stale: true
---
> ## Documentation Index
> Fetch the complete documentation index at: https://guide.ncloud-docs.com/llms.txt
> Use this file to discover all available pages before exploring further.
# 안드로이드 SDK
Classic/VPC 환경에서 이용 가능합니다.
안드로이드 운영 체제용 게임 개발을 위한 GAMEPOT 안드로이드 SDK 사용법에 대해 설명합니다. SDK를 설치하고 환경을 구성함으로써 게임과 대시보드를 연동할 수 있습니다.
## 요구 사양
안드로이드 운영 체제용 GAMEPOT SDK를 사용하기 위한 요구 사양은 다음과 같습니다.
- 최소 사양: API 21 이상, gradle 3.3.3 또는 3.4.3 이상
- 개발 환경: Android Studio
## SDK 설치 및 환경 구성
GAMEPOT 안드로이드 SDK를 설치한 후 환경을 구성하여 GAMEPOT 대시보드와 게임을 연동하고 게임 개발에 필요한 기능을 사용할 수 있습니다.
### SDK 설치
GAMEPOT 안드로이드 SDK를 설치하고 Android Studio에서 프로젝트를 구성하는 방법은 다음과 같습니다.
1. [GAMEPOT SDK 다운로드 > Android](/docs/game-gamepot-gamepotsdk-android)에서 다운로드 링크를 클릭해 주십시오.
2. Android Studio를 실행한 후 게임 프로젝트를 열어 주십시오.
3. 다운로드한 AOS SDK 파일의 압축을 해제한 후 libs 폴더 내의 모든 파일을 게임 프로젝트의 libs 폴더로 복사해 주십시오.
### build.gradle 수정
build.gradle 파일을 수정하는 방법은 다음과 같습니다.
1. 아래 코드를 사용하여 프로젝트 root 폴더의 build.gradle 파일을 수정해 주십시오.
```
buildscript {
repositories {
...
google()
mavenCentral()
maven { url "https://jitpack.io" }
}
dependencies {
...
classpath 'com.google.gms:google-services:4.3.14'
}
}
allprojects {
repositories {
...
google()
mavenCentral()
maven { url "https://jitpack.io" }
}
}
```
2. 표를 참조하여 아래 코드의 값을 수정한 후 코드를 사용하여 app 폴더의 build.gradle 파일을 수정해 주십시오. gamepot_payment 값은 빈칸을 기본으로 합니다.
| 값 | 설명 |
| --- | --- |
| `gamepot_project_id` | GAMEPOT에서 발급받은 프로젝트 ID (대시보드 **프로젝트 설정 > 일반** 메뉴에서 확인) |
| `gamepot_store` | 스토어 값 `google`, `one`, 또는 `galaxy` 입력 |
| `gamepot_app_title` | 앱 제목(FCM) |
| `gamepot_push_default_channel` | 변경 금지(등록된 기본 채널 이름) |
| `facebook_app_id` | 페이스북에서 발급받은 앱 ID |
| `fb_login_protocol_scheme` | fb[페이스북에서 발급받은 앱 ID] ex) fb101010 |
| `facebook_client_token` | 페이스북 콘솔 > 앱 설정 > 고급 설정 > 클라이언트 토큰 |
| `gamepot_elsa_projectid` | 네이버 클라우드 ELSA 서비스를 사용할 경우 ELSA 프로젝트 ID를 입력 ([Effective Log Search & Analytics](https://www.ncloud.com/product/analytics/elsa) 참조) |
| `gamepot_region` | 게임팟 대시보드 생성 리전이 싱가포르인 경우만 sg 입력 |
| `gamepot_license_url` | 게임팟 대시보드 생성 리전이 일본인경우 경우만 https://gamepot.apigw.ntruss.com/fw/jp-v1 입력 |
```
android {
defaultConfig {
...
// GamePot [START]
resValue "string", "gamepot_project_id", "[projectId]" // required
resValue "string", "gamepot_store", "[storeId]" // required
resValue "string", "gamepot_payment", "[storeId]" // optional
resValue "string", "gamepot_app_title","@string/app_name" // required (fcm)
resValue "string", "gamepot_push_default_channel","Default" // required (fcm)
resValue "string", "facebook_app_id", "[Facebook ID]" // facebook
resValue "string", "fb_login_protocol_scheme", "fb[Facebook ID]" // (facebook)
resValue "string", "facebook_client_token", "[페이스북 클라이언트 토큰]" // 페이스북 콘솔 > 앱 설정 > 고급 설정 > 클라이언트 토큰
// resValue "string", "gamepot_elsa_projectid", "" // (ncp elsa)
resValue "string", "gamepot_region", "" // Caution! Only if the gamepot region is Singapore , value as sg
resValue "string", "gamepot_license_url", "" // Caution! Only if the gamepot region is Japan , value as https://gamepot.apigw.ntruss.com/fw/jp-v1
// GamePot [END]
}
packagingOptions {
exclude 'META-INF/proguard/androidx-annotations.pro'
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.multidex:multidex:2.0.1'
// GamePot common [START]
implementation(name: 'gamepot-common', ext: 'aar')
implementation('io.socket:socket.io-client:2.1.0') {
exclude group: 'org.json', module: 'json'
}
implementation('com.github.ihsanbal:LoggingInterceptor:3.0.0') {
exclude group: 'org.json', module: 'json'
}
implementation "com.github.nisrulz:easydeviceinfo:2.4.1"
implementation 'com.android.installreferrer:installreferrer:1.0'
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.jakewharton.timber:timber:4.7.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
implementation 'com.apollographql.apollo:apollo-runtime:2.5.14'
implementation 'com.apollographql.apollo:apollo-android-support:2.5.14'
implementation 'com.android.billingclient:billing:7.0.0'
implementation 'com.google.firebase:firebase-crashlytics-buildtools:2.9.1'
implementation 'com.github.bumptech.glide:glide:4.13.0'
implementation 'androidx.sqlite:sqlite-framework:2.0.1'
implementation 'com.google.firebase:firebase-core:18.0.1'
implementation 'com.google.firebase:firebase-messaging:23.1.2'
implementation 'com.google.firebase:firebase-iid:21.1.0'
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation 'pub.devrel:easypermissions:3.0.0'
implementation(name: 'pageindicatorview-1.0.3', ext: 'aar')
implementation(name: 'puree-4.1.6', ext: 'aar')
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
// GamePot common [END]
implementation(name: 'gamepot-channel-base', ext: 'aar')
// GamePot facebook [START]
implementation(name: 'gamepot-channel-facebook', ext: 'aar')
implementation 'com.facebook.android:facebook-android-sdk:14.1.1'
// GamePot facebook [END]
// GamePot google sigin [START]
implementation(name: 'gamepot-channel-google-signin', ext: 'aar')
implementation "com.google.android.gms:play-services-auth:19.0.0"
// GamePot google sigin [END]
}
// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'
```
3. Google Developer Center에서 획득한 google-service.json 파일을 app 폴더 하위에 복사해 주십시오.
4. Android Studio를 새로 고침해 주십시오.
#### 새로 고침에 실패했을 경우
새로 고침을 시도했을 때 안내 메시지가 표시되면서 실패하는 경우 아래와 같이 해결해 주십시오.
- **메시지**: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'. It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html **설명**: `compile` 설정은 더 이상 지원되지 않으므로 프로젝트 코드에서 `compile`이 입력된 부분을 `implementation`으로 수정해 주십시오.
- **메시지**: No matching client found for package name '[packagename]' **설명**: 앱의 패키지명과 google-service.json 파일에 선언된 패키지 명이 서로 일치하도록 수정해 주십시오.
### AndroidManifest.xml 설정
AndroidManifest.xml을 설정하여 일반적으로 게임에 사용되는 설정 값을 추가하려면 아래 코드를 사용해 주십시오.
```
```
### 푸시 알림 아이콘 설정
푸시 메시지를 수신했을 때 알림 바에 표시할 아이콘을 설정할 수 있습니다. 별도로 설정하지 않을 경우 SDK에 포함된 기본 이미지를 사용하며, 게임에 맞는 아이콘을 직접 설정할 수 있습니다. [Android Asset Studio](http://romannurik.github.io/AndroidAssetStudio/icons-notification.html#source.type=clipart&source.clipart=ac_unit&source.space.trim=1&source.space.pad=0&name=ic_stat_gamepot_small)를 이용해 제작하면 자동으로 폴더별로 이미지가 제작되어 편리합니다.
푸시 알림 아이콘을 설정하는 방법은 다음과 같습니다.
1. 아래와 같이 프로젝트 경로에 res/drawable 폴더를 각각 생성한 후 각 크기별 이미지 파일을 추가해 주십시오.
| 폴더명 | 크기 |
| --- | --- |
| res/drawable-mdpi/ | 24x24 |
| res/drawable-hdpi/ | 36x36 |
| res/drawable-xhdpi/ | 48x48 |
| res/drawable-xxhdpi/ | 72x72 |
| res/drawable-xxxhdpi/ | 96x96 |
2. 이미지 파일 이름을 ic_stat_gamepot_small로 변경해 주십시오.
### 초기화
초기화를 수행하려면 MainActivity.java 파일에서 아래 코드를 사용해 주십시오.
```
import io.gamepot.common.GamePot;
import io.gamepot.common.GamePotLocale;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// GAMEPOT 초기화. context에 반드시 application context를 입력해 주십시오.
// setup API는 다른 API에 앞서 가장 먼저 호출해 주십시오.
GamePot.getInstance().setup(getApplicationContext());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
GamePot.getInstance().onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onStart() {
super.onStart();
GamePotChat.getInstance().start();
GamePot.getInstance().onStart(this);
}
@Override
protected void onStop() {
super.onStop();
GamePotChat.getInstance().stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
GamePot.getInstance().onDestroy();
}
```
## 로그인 관련 기능
구글, 페이스북, 네이버 등 다양한 로그인 SDK 기능을 통합하여 GAMEPOT 안드로이드 SDK에서 사용할 수 있습니다.
### 사용 전 설정
로그인 관련 SDK 기능을 사용하려면 필요한 콘솔 설정을 완료하고 로그인 관련 코드를 선언해야 합니다.
#### 구글 Firebase 콘솔 설정
로그인 기능을 사용하기 위해 구글 Firebase 콘솔을 설정하려면 APK를 구성할 때 사용한 Keystore 파일의 SHA-1 값을 Firebase 콘솔에 추가해 주십시오.
#### 페이스북 콘솔 설정
로그인 기능을 사용하기 위해 페이스북 콘솔을 설정하는 방법은 다음과 같습니다.
1. Facebook for Developers 콘솔에서 앱 유형을 **None** 또는 **Consumer** 또는 **Gaming**으로 선택한 후 앱을 생성해 주십시오.
2. APK를 구성할 때 사용한 Keystore의 키 해시값을 Facebook for Developers 콘솔에 추가해 주십시오.
#### MainActivity.java 설정
로그인 관련 코드를 선언하여 MainActivity.java 파일을 설정하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.facebook.GamePotFacebook;
import io.gamepot.channel.google.signin.GamePotGoogleSignin;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// setup API를 가장 먼저 호출해 주십시오.
GamePot.getInstance().setup(getApplicationContext());
...
// 로그인을 사용하려는 채널별로 addChannel을 호출해 주십시오. Guest 방식은 기본으로 포함됩니다.
// Google Login 초기화
GamePotChannel.getInstance().addChannel(this, GamePotChannelType.GOOGLE, new GamePotGoogleSignin());
// Facebook Login 초기화
GamePotChannel.getInstance().addChannel(this, GamePotChannelType.FACEBOOK, new GamePotFacebook());
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
GamePotChannel.getInstance().onActivityResult(this, requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
super.onDestroy();
GamePotChannel.getInstance().onDestroy();
}
}
```
### 로그인 기능
개발사에서 구현한 로그인 UI에 따라 로그인 버튼을 클릭했을 때 동작하는 SDK 로그인 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelListener;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.GamePotUserInfo;
import io.gamepot.common.GamePotError;
// 로그인 타입 정의
// GamePotChannelType.GOOGLE: 구글
// GamePotChannelType.FACEBOOK: 페이스북
// GamePotChannelType.NAVER: 네이버
// GamePotChannelType.LINE: 라인
// GamePotChannelType.TWITTER: 트위터
// GamePotChannelType.APPLE: 애플
// GamePotChannelType.GUEST: 게스트
// 구글 로그인 버튼을 눌렀을 때 호출
GamePotChannel.getInstance().login(this, GamePotChannelType.GOOGLE, new GamePotChannelListener() {
@Override
public void onCancel() {
// 사용자가 로그인을 취소한 상황
}
@Override
public void onSuccess(GamePotUserInfo userinfo) {
// 로그인 성공. 게임의 로직에 맞게 처리해 주십시오.
// userinfo.getMemberid() : 회원 고유 아이디
}
@Override
public void onFailure(GamePotError error) {
// 로그인 실패. error.getMessage()를 사용하여 오류 메시지를 표시해 주십시오.
}
});
```
#### 회원 고유 아이디 획득
게임 회원의 고유 아이디 값을 획득하려면 아래 코드를 사용해 주십시오.
```
GamePot.getInstance().getMemberId();
```
#### 계정별 로그인 기능 사용
계정별 로그인 기능을 사용하려면 아래의 코드를 사용하여 설정을 적용해 주십시오.
- **네이버 로그인**
```
android {
defaultConfig {
...
resValue "string", "gamepot_naver_clientid", "xxxxxxxx" // Naver 개발자 콘솔에서 획득
resValue "string", "gamepot_naver_secretid", "xxx" // Naver 개발자 콘솔에서 획득
}
}
dependencies {
...
compile(name: 'gamepot-channel-naver', ext: 'aar')
...
}
```
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.naver.GamePotNaver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
GamePotChannel.getInstance().addChannel(this, GamePotChannelType.NAVER, new GamePotNaver());
}
```
```
GamePotChannel.getInstance().login(this, GamePotChannelType.NAVER, new GamePotAppStatusChannelListener() {
...
});
```
- build.gradle 설정
- MainActivity.java 설정
- 로그인
- **라인 로그인**
```
android {
defaultConfig {
...
resValue "string", "gamepot_line_channelid","00000000" // Line 개발자 콘솔에서 획득
}
}
dependencies {
...
compile(name: 'gamepot-channel-line', ext: 'aar')
compile(name: 'line-sdk-4.0.10', ext: 'aar')
...
}
```
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.line.GamePotLine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
GamePotChannel.getInstance().addChannel(this, GamePotChannelType.LINE, new GamePotLine());
}
```
```
GamePotChannel.getInstance().login(this, GamePotChannelType.LINE, new GamePotAppStatusChannelListener() {
...
});
```
- build.gradle 설정
- MainActivity.java 설정
- 로그인
- **애플 웹 로그인**
```
dependencies {
...
compile(name: 'gamepot-channel-apple-signin', ext: 'aar')
...
}
```
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.apple.signin.GamePotAppleSignin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
GamePotChannel.getInstance().addChannel(this, GamePotChannelType.APPLE, new GamePotAppleSignin());
}
```
```
GamePotChannel.getInstance().login(this, GamePotChannelType.APPLE, new GamePotAppStatusChannelListener() {
...
});
```
- build.gradle 설정
- MainActivity.java 설정
- 로그인
### 자동 로그인 기능
회원이 마지막으로 로그인했던 정보를 전달하는 API를 통한 자동 로그인 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelListener;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.GamePotUserInfo;
import io.gamepot.common.GamePotError;
// 사용자가 마지막에 로그인했던 정보를 전달하는 API
final GamePotChannelType lastLoginType = GamePotChannel.getInstance().getLastLoginType();
if(lastLoginType != GamePotChannelType.NONE) {
// 마지막에 로그인했던 로그인 타입으로 로그인하는 방식입니다.
GamePotChannel.getInstance().login(this, lastLoginType, new GamePotChannelListener() {
@Override
public void onCancel() {
// 사용자가 로그인을 취소한 상황
}
@Override
public void onSuccess(GamePotUserInfo info) {
// 자동 로그인 완료. 게임 로직에 맞게 처리해 주십시오.
}
@Override
public void onFailure(GamePotError error) {
// 자동 로그인 실패. error.getMessage()를 이용해서 오류 메시지를 표시해 주십시오.
}
});
}
else
{
// 처음 게임을 실행했거나 로그아웃한 상태. 로그인을 할 수 있는 로그인 화면으로 이동해 주십시오.
}
```
### 로그아웃 기능
로그아웃 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.common.GamePotCommonListener;
import io.gamepot.common.GamePotError;
GamePotChannel.getInstance().logout(this, new GamePotCommonListener() {
@Override
public void onSuccess() {
// 로그아웃 완료. 초기 화면으로 이동해 주십시오.
}
@Override
public void onFailure(GamePotError error) {
// 로그아웃 실패. error.getMessage()를 이용해서 오류 메시지를 표시해 주십시오.
}
});
```
### 회원 탈퇴 기능
회원 탈퇴 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.common.GamePotCommonListener;
import io.gamepot.common.GamePotError;
GamePotChannel.getInstance().deleteMember(this, new GamePotCommonListener() {
@Override
public void onSuccess() {
// 회원 탈퇴 성공. 초기화면으로 이동해 주십시오.
}
@Override
public void onFailure(GamePotError error) {
// 회원 탈퇴 실패. error.getMessage()를 이용해서 오류 메시지를 표시해 주십시오.
}
});
```
### 로그인 검증 기능
로그인 완료 후 로그인 정보를 개발사 서버에서 GAMEPOT 서버로 전달하여 로그인 검증을 진행할 수 있습니다.
자세한 설명은 [로그인 검증 요청](/docs/game-gamepotserver#%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B2%80%EC%A6%9D%EC%9A%94%EC%B2%AD)을 참조해 주십시오.
## 외부 계정 연동
하나의 게임 계정에 여러 개의 외부 계정을 연결 또는 연결 해제할 수 있습니다.
### 계정 연동 기능
구글, 페이스북, 네이버 등 다양한 외부 계정과의 연동 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelListener;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.GamePotUserInfo;
import io.gamepot.common.GamePotError;
// 구글 계정에 연동
// GamePotChannelType.GOOGLE
// 페이스북 계정에 연동
// GamePotChannelType.FACEBOOK
// 네이버 계정에 연동
// GamePotChannelType.NAVER
// 라인 계정에 연동
// GamePotChannelType.LINE
// 트위터 계정에 연동
// GamePotChannelType.TWITTER
// 애플 계정에 연동
// GamePotChannelType.APPLE
GamePotChannel.getInstance().createLinking(this, GamePotChannelType.GOOGLE, new GamePotChannelListener() {
@Override
public void onSuccess(GamePotUserInfo userInfo) {
// 연동 완료. 연동 결과에 대한 메시지를 표시해 주십시오. (예: "계정 연동에 성공했습니다.")
}
@Override
public void onCancel() {
// 사용자가 연동 과정을 취소
}
@Override
public void onFailure(GamePotError error) {
// 연동 실패. error.getMessage()를 이용해서 오류 메시지를 표시해 주십시오.
}
});
```
### 연동 리스트 확인 기능
계정에 연동된 외부 계정 목록을 확인하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import java.util.ArrayList;
// 타입 정의
// GamePotChannelType.GOOGLE
// GamePotChannelType.FACEBOOK
// GamePotChannelType.NAVER
// GamePotChannelType.LINE
// GamePotChannelType.TWITTER
// GamePotChannelType.APPLE
// 타입에 따른 연동 결과를 반환합니다.
boolean isLinked = GamePotChannel.getInstance().isLinked(GamePotChannelType.GOOGLE);
// 연동되어 있는 모든 타입에 대해 JSON 형태로 반환합니다.
// 만약 구글과 페이스북에 연동된 경우 아래와 같이 반환됩니다.
// [{“provider”:”google”},{“provider”:”facebook”}]
JSONArray linking = GamePotChannel.getInstance().getLinkedList();
```
### 연동 해제 기능
외부 계정과의 연동 해제 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.common.GamePotCommonListener;
import io.gamepot.common.GamePotError;
GamePotChannel.getInstance().deleteLinking(this, GamePotChannelType.GOOGLE, new GamePotCommonListener() {
@Override
public void onSuccess() {
// 연동 해제 완료. 연동 결과에 대한 문구를 노출시켜 주세요. (예: 계정 연동을 해지했습니다.)
}
@Override
public void onFailure(GamePotError error) {
// 연동 해제 실패. error.getMessage()를 이용해서 오류 메시지를 보여주세요.
}
});
```
## 결제 기능
```
게임팟 결제는 소모성 인앱 상품 타입만을 지원하고 있으며 원스토어 인앱 SDK는 V21버전만 지원합니다.
원스토어 인앱 SDK 포함 : gamepot-billing-onestore.aar
갤럭시 스토어 인앱 SDK 포함: gamepot-billing-galaxystore.aar
마이카드 인앱 SDK 포함 : gamepot-billing-mycard.aar ( 구글 스토어 빌드에는 포함되지 않도록 조치 해주세요.)
```
인앱 구매를 위한 결제 기능을 사용할 수 있습니다. 결제의 결과 값은 Listener 형태로 구현됩니다.
원스토어의 경우 아래 과정이 필요합니다.
1. build.gradle (:project) 내 하기 문구를 추가해 주십시오.
```
allprojects {
repositories {
...
mavenCentral()
maven { url 'https://repo.onestore.co.kr/repository/onestore-sdk-public' }
...
}
}
```
1. build.gradle (:app) 내 하기 문구를 추가해 주십시오.
```
dependencies {
...
implementation(name: 'gamepot-billing-onestore', ext: 'aar')
implementation 'com.onestorecorp.sdk:sdk-iap:21.01.00'
...
}
```
1. AndroidManifest.xml 파일 내 하기 문구를 추가해 주십시오.
```
```
### MainActivity.java 설정
결제 기능을 사용하기 위해 MainActivity.java 파일을 설정하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.common.GamePot;
import io.gamepot.common.GamePotPurchaseInfo;
import io.gamepot.common.GamePotPurchaseListener;
import io.gamepot.common.GamePotError;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// setup API는 가장 먼저 호출해 주십시오.
GamePot.getInstance().setup(getApplicationContext());
...
GamePot.getInstance().setPurchaseListener(new GamePotPurchaseListener() {
@Override
public void onSuccess(GamePotPurchaseInfo info) {
// 결제 성공. 아이템 지급 요청은 웹훅에 설정된 주소로 server to server로 요청합니다.
// 여기에서는 결과에 대한 처리만 수행하고, 실제 아이템은 지급하지 마십시오.
}
@Override
public void onFailure(GamePotError error) {
// 결제 실패. error.getMessage()를 이용해서 오류 메시지를 표시해 주십시오.
}
@Override
public void onCancel() {
// 결제 진행 중 사용자가 취소한 경우
}
});
...
}
}
```
### 결제 시도 기능
하나의 결제 API로 구글 플레이스토어와 원스토어 모두에서 결제 시도 기능을 사용할 수 있습니다.
결제 시도 기능을 사용하려면 아래의 코드를 사용해 주십시오.
- 일반 결제 시도
```
import io.gamepot.common.GamePot;
// productId : 스토어에 등록된 상품 ID
GamePot.getInstance().purchase("product id");
```
- 결제 시도 및 영수증 번호를 별도로 관리
```
import io.gamepot.common.GamePot;
// productId : 스토어에 등록된 상품 ID
// uniqueId : 별도로 관리하는 영수증 번호
GamePot.getInstance().purchase("product id", "uniqueId");
```
- 결제 시도, 영수증 번호를 별도로 관리, 캐릭터 정보를 웹훅으로 전달
원스토어 버전의 경우 uniqueId+serverId+playerId+etc 한 길이가 85byte 미만이 되어야 결제가 가능합니다.
```
import io.gamepot.common.GamePot;
// productId : 스토어에 등록된 상품ID
// uniqueId : 별도로 관리하는 영수증 번호
// serverId : 결제를 진행한 캐릭터의 서버 ID
// playerId : 결제를 진행한 캐릭터의 캐릭터 ID
// etc : 결제를 진행한 캐릭터의 기타 정보
GamePot.getInstance().purchase("product id","uniqueId","serverId","playerId","etc");
```
### 결제 아이템 리스트 획득 기능
스토어에서 전달하는 인앱 결제 아이템 리스트를 획득하는 기능을 사용하려면 아래 코드를 사용해 주십시오.
로그인 성공 후 호출을 해야 하는 API로 getPurchaseDetailList API의 경우 비동기적으로 스토어 인앱 SDK로 부터 전달 받은 내용을 드리는 API이기때문에 호출하는 타이밍에 따라 빈 값으로 전달 될수도 있습니다. ( 결제 가능한 환경 기준)
```
import io.gamepot.common.GamePot;
//[case1]
GamePotPurchaseDetailList details = GamePot.getInstance().getPurchaseDetailList();
//[case2]
GamePot.getInstance().getPurchaseDetailListAsync(new GamePotListener() {
@Override
public void onSuccess(GamePotPurchaseDetailList data) {
//data : In-app information
}
@Override
public void onFailure(GamePotError error) {
// api error
}
});
```
### 결제 아이템 지급 기능
결제 스토어의 영수증 내역과 대조하여 검증을 모두 완료한 경우에만 개발사 서버에 지급 요청을 전송하도록 설정할 수 있습니다.
자세한 설명은 [아이템 지급 요청](/docs/game-gamepotserver#%EC%95%84%EC%9D%B4%ED%85%9C%EC%A7%80%EA%B8%89%EC%9A%94%EC%B2%AD)을 참조해 주십시오.
### Mycard 결제
Mycard 라이브러리 : [gamepot-billing-mycard.aar](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/gamepot-billing-mycard.aar?sv=2026-02-06&spr=https&st=2026-11-14T06%3A18%3A32Z&se=2026-11-14T07%3A18%3A32Z&sr=c&sp=r&sig=Fv7Nf5xkzfRGGwWQs96V0w7R3DQc5x2JrtqoQvanhxI%3D)
참고
마이카드 와 연동하기 위한 FacServiceID / KEY 값은 마이카드 측을 통해 확인 후 대시보드에 설정 해주세요.
1. 대시보드 >> 결제 >> IAP의 스토어 타입:Google 항목 > 가격추가 > 통화(ex. TWD)/가격 정보를 기입후 저장해주세요.
2. 대시보드 >> 프로젝트 설정 >> 외부결제 항목에 MyCard를 추가하고 해당 FacService ID / Sign Key 가 정상적으로 입력되어 있는지 확인해주세요.
3. 결제는 SDK의 아래 코드를 호출 합니다.
GamePot.getInstance().purchase("product id");
- MyCard 사용 중 결제 아이템 호출 형태는 기존 GamePot.getInstance().getPurchaseDetailList(); 호출 시 에러발생 됩니다.
이를 대체하여 GamePot.getInstance().getPurchaseThirdPaymentsDetailList();을 호출 해주세요.
4. ./AndroidManifest.xml 파일에 레벨에 name을 제거 합니다.
```
```
1. build.gradle 파일에 아래와 같이 설정 합니다.
```
resValue "string", "gamepot_store", "google"
resValue "string", "gamepot_payment", "mycard" // 스토어가 google인 경우만 동작합니다.
```
1. ../libs 폴더 내에 gamepot-billing-mycard.aar 이 포함 되어 있는지 확인 합니다.
2. build.gradle 파일 내에 빌드시 라이브러리가 포함될 수 있도록 설정되어 있는지 확인 합니다.
ex) implementation(name: 'gamepot-billing-mycard', ext: 'aar') 이 포함 되어 있는지 확인 합니다.
### 외부 결제 기능
원스토어 기준 : 원스토어에서 지원하는 인앱 SDK를 사용하지 않는 결제 모듈과 연동하려면 먼저 [외부 결제 서비스 연동](/docs/game-gamepot-projectmgmt#%EC%99%B8%EB%B6%80%EA%B2%B0%EC%A0%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EC%97%B0%EB%8F%99)을 참조하여 설정을 완료한 후 아래의 코드를 사용해 주십시오.
- **결제 시도**
```
import io.gamepot.common.GamePot;
// activity : 현재 액티비티
// product id : 대시보드에 등록한 결제 아이디
GamePot.getInstance().purchaseThirdPayments(activity, product id);
```
- **결제 아이템 목록 획득**
```
import io.gamepot.common.GamePot;
GamePotPurchaseDetailList thirdPaymentsDetailList = GamePot.getInstance().getPurchaseThirdPaymentsDetailList();
```
## SDK 자체 제공 로그인 UI
GAMEPOT 안드로이드 SDK가 제공하는 완성된 형태의 로그인 UI를 사용할 수 있습니다.
### SDK 자체 제공 로그인 UI 사용
MainActivity.java 파일을 설정하여 자체 제공 로그인 UI를 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.channel.GamePotChannel;
import io.gamepot.channel.GamePotChannelListener;
import io.gamepot.channel.GamePotAppStatusChannelListener;
import io.gamepot.channel.GamePotChannelType;
import io.gamepot.channel.GamePotChannelLoginBuilder;
import io.gamepot.channel.GamePotUserInfo;
import io.gamepot.common.GamePotError;
String[] channelList = {"google", "facebook", "naver", "line", "twitter", "apple", "guest"};
GamePotChannelLoginBuilder builder = new GamePotChannelLoginBuilder(channelList);
// 로그인 버튼을 눌렀을 때 호출
GamePotChannel.getInstance().showLoginWithUI( this, builder, new GamePotAppStatusChannelLoginDialogListener() {
@Override
public void onExit() {
// X 버튼 클릭시 처리
}
@Override
public void onNeedUpdate(GamePotAppStatus status) {
// TODO: 강제 업데이트가 필요한 경우. 아래 API를 호출하면 SDK 자체에서 팝업을 띄울 수 있습니다.
// TODO: Customizing을 하고자 하는 경우 아래 API를 호출하지 말고 Customizing을 하면 됩니다.
GamePot.getInstance().showAppStatusPopup(this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// TODO: showAppStatusPopup API를 호출하신 경우 앱을 종료해야 하는 상황에 호출됩니다.
// TODO: 종료 프로세스를 처리해주세요.
MainActivity.this.finish();
}
@Override
public void onNext(Object obj) {
// TODO : Dashboard 업데이트 설정에서 권장 설정 시 "다음에 하기" 버튼이 노출 됩니다.
// 해당 버튼을 사용자가 선택 시 호출 됩니다.
// TODO : obj 정보를 이용하여 로그인 완료 시와 동일하게 처리해주세요.
// GamePotUserInfo userInfo = (GamePotUserInfo)obj;
}
});
}
@Override
public void onMainternance(GamePotAppStatus status) {
// TODO: 점검 중인 경우. 아래 API를 호출하면 SDK 자체에서 팝업을 띄울 수 있습니다.
// TODO: Customizing을 하고자 하는 경우 아래 API를 호출하지 말고 Customizing을 하면 됩니다.
GamePot.getInstance().showAppStatusPopup(this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// TODO: showAppStatusPopup API를 호출하신 경우 앱을 종료해야 하는 상황에 호출됩니다.
// TODO: 종료 프로세스를 처리해주세요.
MainActivity.this.finish();
}
});
}
@Override
public void onCancel() {
// 사용자가 로그인을 취소한 상황.
}
@Override
public void onSuccess(GamePotUserInfo userinfo) {
// 로그인 완료. 게임 로직에 맞게 처리해주세요.
// userinfo.getMemberid() : 회원 고유 아이디
}
@Override
public void onFailure(GamePotError error) {
// 로그인 실패. error.getMessage()를 이용해서 오류 메시지를 보여주세요.
}
@Override
public void onGameServiceConflict(GamePotUserInfo conflictUserInfo) {
// GPGS 계정 연동을 사용하는 경우 발생할 수 있는 이벤트입니다.
}
});
```
### 자체 제공 로그인 UI 이미지 로고 설정
자체 제공 로그인 UI 상단에 표시되는 이미지를 설정할 수 있습니다. 별도로 설정하지 않을 경우 SDK에 포함된 기본 이미지를 사용하며, 게임에 맞는 이미지를 직접 설정할 수 있습니다.
자체 제공 로그인 UI 이미지를 설정하는 방법은 다음과 같습니다.
1. 아래와 같이 rew/drawable 폴더를 각각 생성한 후 각 크기별 이미지 파일을 추가해 주십시오.
| 폴더명 | 크기 |
| --- | --- |
| res/drawable-mdpi/ | 24x24 |
| res/drawable-hdpi/ | 36x36 |
| res/drawable-xhdpi/ | 48x48 |
| res/drawable-xxhdpi/ | 72x72 |
| res/drawable-xxxhdpi/ | 96x96 |
2. 이미지 파일 이름을 ic_stat_gamepot_small로 변경해 주십시오.
## 쿠폰 기능
사용자가 쿠폰을 입력하면 사용 처리하는 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.common.GamePot;
import io.gamepot.common.GamePotError;
import io.gamepot.common.GamePotListener;
GamePot.getInstance().coupon(/*사용자에게 입력받은 쿠폰*/, new GamePotListener() {
@Override
public void onSuccess(String message) {
// 쿠폰 사용 성공. message값을 팝업으로 표시해 주십시오.
}
@Override
public void onFailure(GamePotError error) {
// 쿠폰 사용 실패. error.getMessage()를 이용해서 오류 메시지를 표시해 주십시오.
}
});
```
### 아이템 지급
쿠폰 사용에 성공하면 개발사 서버에 아이템 지급을 요청합니다.
자세한 설명은 [아이템 지급 요청](/docs/game-gamepotserver#%EC%95%84%EC%9D%B4%ED%85%9C%EC%A7%80%EA%B8%89%EC%9A%94%EC%B2%AD)을 참조해 주십시오.
## 푸시 기능
일반 푸시, 야간 푸시, 광고성 푸시 기능 활성화 또는 비활성화가 가능합니다. 광고성 푸시 설정은 푸시기능을 사용하신다면 true 로 해주세요 (광고성 푸시 값이 false 시 일반/야간 푸시 설정 상관없이 푸시가 오지 않습니다.)
### 푸시 권한 요청
안드로이드 13 버전 이상에서 푸시 수신을 위해 런타임 권한 요청 및 허용이 필요합니다. 런타임 푸시 권한을 요청하려면 아래의 코드를 사용해 주십시오.
```
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.core.content.ContextCompat;
private final ActivityResultLauncher requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
});
private void askNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
PackageManager.PERMISSION_GRANTED) {
// already granted
} else {
// request the permission
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
}
}
}
// onCreate에서 호출 예시
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GamePot.getInstance().setup(getApplicationContext());
// 푸시 권한 요청
askNotificationPermission();
}
```
### 푸시 활성화 및 비활성화
푸시 수신 여부를 변경하려면 아래의 코드를 사용해 주십시오.
```
import io.gamepot.common.GamePot;
import io.gamepot.common.GamePotError;
import io.gamepot.common.GamePotCommonListener;
// 푸시 수신 On/Off
GamePot.getInstance().setPushEnable(/*true or false*/, new GamePotCommonListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(GamePotError error) {
}
});
// 야간 푸시 수신 On/Off
GamePot.getInstance().setNightPushEnable(/*true or false*/, new GamePotCommonListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(GamePotError error) {
}
});
// 푸시, 야간 푸시를 한번에 설정
// 로그인 전에 푸시, 야간 푸시 허용 여부를 확인하는 게임인 경우 로그인 후에 아래 코드로 반드시 호출해 주십시오.
GamePot.getInstance().setPushEnable(/*true or false*/, /*true or false*/, true, new GamePotCommonListener() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(GamePotError error) {
}
});
```
### 푸시 상태 확인
현재 푸시 상태를 확인하려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.common.GamePot;
import org.json.JSONObject;
// enable: 전체 푸시
// night: 야간 푸시
// {"enable":true, "night":true}
JSONObject status = GamePot.getInstance().getPushStatus();
```
## 공지사항 이미지 표시 기능
대시보드의 **공지사항** 메뉴에 업로드한 이미지가 표시되도록 설정할 수 있습니다. 권장 이미지 크기는 아래와 같습니다.
- 크기: 720x1200(Portrait), 1280x640(Landscape)
- 용량: 250 kB 이하
대시보드 **공지사항** 메뉴에 업로드한 이미지가 표시되도록 하려면 아래 코드를 사용해 주십시오.
```
/* showTodayButton : '오늘 하루 보지 않기' 버튼 노출 여부. false인 경우 무조건 노출 */
boolean showTodayButton = true;
GamePot.getInstance().showNotice(/*현재 액티비티*/, showTodayButton, new GamePotNoticeDialog.onSchemeListener() {
@Override
public void onReceive(String scheme) {
// scheme 처리
}
});
```
### 특정한 분류의 공지사항 이미지만 표시
특정한 분류의 공지사항 이미지만 표시되도록 하려면 아래 코드를 사용해 주십시오.
```
/* 대시보드 공지사항 >> 분류에서 설정한 분류명 */
string type = "";
GamePot.getInstance().showEvent(/*현재 액티비티*/, type, new GamePotNoticeDialog.onSchemeListener() {
@Override
public void onReceive(String scheme) {
// scheme 처리
}
});
```
## 고객지원 기능
대시보드와 연동하여 고객 문의, 정책 및 약관 UI 호출, 동의 수집 등의 기능을 사용할 수 있습니다.
### 고객 문의 기능
회원이 문의를 발송하고 담당자가 답변할 수 있는 고객 문의 기능을 사용할 수 있습니다. 대시보드의 **고객지원 > 고객문의** 메뉴와 연동됩니다.
고객문의 UI는 디바이스 언어에 따라 한국어, 영어, 일어, 중국어 간체 및 번체 중 하나의 언어로 변경되며, 이외의 디바이스 언어일 경우 영어로 변경됩니다.
대시보드와 연동하여 고객문의 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
GamePot.getInstance().showCSWebView(/*현재 액티비티*/);
```
#### 외부 링크 고객 문의
외부 링크를 통해 로그인하지 않은 고객도 문의를 등록할 수 있도록 하려면 아래 코드를 사용해 주십시오.
```
String url = "GAMEPOT에서 발급받은 외부 고객지원 URL";
GamePot.getInstance().showWebView(/*현재 액티비티*/, url, true);
```
### FAQ 기능
대시보드의 **FAQ** 메뉴와 연동되는 FAQ 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
GamePot.getInstance().showFaq(/*현재 액티비티*/);
```
### 약관 및 정책 UI 호출 기능
대시보드의 **고객지원** 메뉴에서 작성한 각종 약관, 정책을 UI로 호출할 수 있습니다.
약관 및 정책 UI를 호출하려면 아래 코드를 사용해 주십시오.
- **이용약관**
```
import io.gamepot.common.GamePot;
// activity : 현재 액티비티
GamePot.getInstance().showTerms(activity);
```
- **개인정보처리방침**
```
import io.gamepot.common.GamePot;
// activity : 현재 액티비티
GamePot.getInstance().showPrivacy(activity);
```
- **환불정책**
```
import io.gamepot.common.GamePot;
// activity : 현재 액티비티
GamePot.getInstance().showRefund(activity);
```
### 약관 동의 기능 (GDPR 포함)
제공되는 팝업 UI 기능을 사용하여 대시보드에서 작성한 각종 정책과 약관에 대한 동의를 수집할 수 있습니다. GDPR 정책에 대한 동의도 수집 가능합니다.
#### 약관 동의 자동 호출
GAMEPOT 안드로이드 SDK 버전 v3.3.0 이상을 사용하는 경우 회원이 로그인할 때 자동으로 약관 동의 팝업이 표시됩니다.
로그인할 때의 약관 동의 자동 호출 여부를 변경하려면 하려면 아래 코드를 사용해 주십시오.
```
// 자동으로 표시되는 팝업에는 MATERIAL_BLUE 테마가 적용됩니다.
// 기본값은 true입니다.
// false로 설정하면 약관 동의 팝업이 자동으로 표시되지 않습니다.
GamePot.getInstance().setAutoAgree(true);
// MATERIAL_ORANGE 테마로 커스텀 적용 시
GamePotAgreeBuilder bulider = new GamePotAgreeBuilder(GamePotAgreeBuilder.THEME.MATERIAL_ORANGE);
GamePot.getInstance().setAutoAgreeBuilder(bulider);
...
GamePotChannel.getInstance().login(GamePotChannelType);
...
```
#### 수동 약관 동의 호출
약관 동의 호출을 수동으로 수행하려면 아래 코드를 사용해 주십시오.
- 테마 선택
```
// 기본 테마
GamePotAgreeBuilder.THEME.BLUE
GamePotAgreeBuilder.THEME.GREEN
//개선 테마
GamePotAgreeBuilder.THEME.MATERIAL_RED,
GamePotAgreeBuilder.THEME.MATERIAL_BLUE,
GamePotAgreeBuilder.THEME.MATERIAL_CYAN,
GamePotAgreeBuilder.THEME.MATERIAL_ORANGE,
GamePotAgreeBuilder.THEME.MATERIAL_PURPLE,
GamePotAgreeBuilder.THEME.MATERIAL_DARKBLUE,
GamePotAgreeBuilder.THEME.MATERIAL_YELLOW,
GamePotAgreeBuilder.THEME.MATERIAL_GRAPE,
GamePotAgreeBuilder.THEME.MATERIAL_GRAY,
GamePotAgreeBuilder.THEME.MATERIAL_GREEN,
GamePotAgreeBuilder.THEME.MATERIAL_PEACH,
```
- 호출
```
// 기본 호출(MATERIAL_BLUE 테마 적용)
GamePot.getInstance().showAgreeDialog(/*activity*/, new GamePotAgreeBuilder(), new GamePotListener() {
@Override
public void onSuccess(GamePotAgreeInfo data) {
// data.agree: 필수 약관을 모두 동의한 경우 true
// data.agreePush: 일반 광고성 수신 동의를 체크한 경우 true, 그렇지 않으면 false
// data.agreeNight: 야간 광고성 수신 동의를 체크한 경우 true, 그렇지 않으면 false
// agreePush / agreeNight 값은 로그인 완료 후 setPushEnable api를 통해 한번에 설정해주십시오.
}
@Override
public void onFailure(GamePotError error) {
// error.message를 팝업 등으로 표시해 주십시오.
}
});
// MATERIAL_ORANGE 테마 적용 시
GamePotAgreeBuilder bulider = new GamePotAgreeBuilder(GamePotAgreeBuilder.THEME.MATERIAL_ORANGE);
GamePot.getInstance().showAgreeDialog(/*activity*/, bulider, new GamePotListener() {
....
}
```
#### 약관 동의 UI 테마 직접 구성
SDK에서 제공하는 테마를 사용하는 대신 직접 구성한 약관 동의 UI 테마를 사용할 수 있습니다.
약관 동의 UI 테마를 직접 구성하여 사용하려면 약관 동의를 호출하기 전에 아래 코드를 사용하여 테마를 구성해 주십시오.
```
GamePotAgreeBuilder agreeBuilder= new GamePotAgreeBuilder();
agreeBuilder.setHeaderBackGradient(new int[] {0xFF00050B,0xFF0F1B21});
agreeBuilder.setHeaderTitleColor(0xFFFF0000);
agreeBuilder.setHeaderBottomColor(0xFF00FF00);
// 미사용시 ""로 설정
agreeBuilder.setHeaderTitle("약관 동의");
// res/drawable 객체 아이디
agreeBuilder.setHeaderIconDrawable(R.drawable.ic_stat_gamepot_agree);
agreeBuilder.setContentBackGradient(new int[] { 0xFFFF2432, 0xFF11FF32 });
agreeBuilder.setContentTitleColor(0xFF0429FF);
agreeBuilder.setContentCheckColor(0xFFFFADB5);
agreeBuilder.setContentIconColor(0xFF98FFC6);
agreeBuilder.setContentShowColor(0xFF98B3FF);
// res/drawable 객체 아이디
agreeBuilder.setContentIconDrawable(R.drawable.ic_stat_gamepot_small);
agreeBuilder.setFooterBackGradient(new int[] { 0xFFFFFFFF, 0xFF112432 });
agreeBuilder.setFooterButtonGradient(new int[] { 0xFF1E3A57, 0xFFFFFFFF });
agreeBuilder.setFooterButtonOutlineColor(0xFFFF171A);
agreeBuilder.setFooterTitleColor(0xFFFF00D5);
agreeBuilder.setFooterTitle("게임 시작하기");
//광고성 수신 동의(일반/야간) 체크 후 게임 시작 시 Toast 메시지(동의 시간) 노출 여부
agreeBuilder.setShowToastPushStatus(true);
// 광고성 수신 동의(일반/야간) 메시지 수정
agreeBuilder.setPushToastMsg("Push on");
agreeBuilder.setNightPushToastMsg("Night Push on");
// 일반 광고성 수신동의 버튼 노출 여부
agreeBuilder.setShowPush(true);
// 야간 광고성 수신동의 버튼 노출 여부
agreeBuilder.setShowNightPush(true);
// 일반 광고성 수신동의 링크 버튼 설정(미사용 시 입력하지 않음)
agreeBuilder.setPushDetailURL("https://...");
// 야간 광고성 수신동의 링크 버튼 설정 (미사용 시 입력하지 않음)
agreeBuilder.setNightPushDetailURL("https://...");
// 문구 변경
agreeBuilder.setAllMessage("모두 동의");
agreeBuilder.setTermMessage("필수) 이용약관");
agreeBuilder.setPrivacyMessage("필수) 개인정보 취급 방침");
agreeBuilder.setPushMessage("선택) 일반 푸시 수신 동의");
agreeBuilder.setNightPushMessage("선택) 야간 푸시 수신 동의");
GamePot.getInstance().showAgreeDialog(/*activity*/, agreeBuilder, new GamePotListener() {
....
}
```
- 각 변수는 아래 이미지에 표시된 영역에 적용됩니다.
- **AgeView**

- **EmailView**

- **AgreeView**

#### GDPR 약관 체크리스트 기능
대시보드에서 활성화한 GDPR 약관 항목을 리스트 형태로 가져오려면 아래 코드를 사용해 주십시오.
```
import io.gamepot.common.GamePot;
(List) GamePot.getInstance().getGDPRCheckedList();
//리턴되는 각 파라미터는 대시보드의 다음 설정에 해당합니다.
gdpr_privacy : 개인정보취급방침
gdpr_term : 이용약관
gdpr_gdpr : GDPR 이용약관
gdpr_push_normal : 이벤트 푸시 수신동의
gdpr_push_night : 야간 이벤트 푸시 수신동의 (한국만 해당)
gdpr_adapp_custom : 개인 맞춤광고 보기에 대한 동의 (GDPR 적용 국가)
gdpr_adapp_nocustom : 개인 맞춤이 아닌 광고 보기에 대한 동의 (GDPR 적용 국가)
```
## 점검 및 강제 업데이트 기능
게임 점검 및 강제 업데이트 기능을 사용할 수 있습니다. 대시보드의 **점검 & 업데이트** 메뉴에서 각 기능을 활성화하면 동작합니다.
점검 및 강제 업데이트 기능을 사용하려면 아래 코드를 사용해 주십시오.
```
GamePotChannel.getInstance().login(this, GamePotChannelType.GOOGLE, new GamePotAppStatusChannelListener() {
@Override
public void onNeedUpdate(GamePotAppStatus status) {
// 강제 업데이트 필요. 아래 API를 호출하면 SDK 자체 팝업을 표시할 수 있습니다.
// Customizing을 하고자 하는 경우 아래 API를 호출하지 않은 상태에서 Customizing을 수행해 주십시오.
GamePot.getInstance().showAppStatusPopup(MainActivity.this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// showAppStatusPopup API를 호출한 경우 앱을 종료해야 하는 상황에 호출됩니다.
// 종료 프로세스를 처리해 주십시오.
MainActivity.this.finish();
}
@Override
public void onNext(Object obj) {
// 대시보드 업데이트 설정에서 권장 설정 시 "다음에 하기" 버튼이 표시됩니다.
// 해당 버튼을 사용자가 선택하면 표시됩니다.
// obj 정보를 이용하여 로그인 완료 시와 동일하게 처리해 주십시오.
// GamePotUserInfo userInfo = (GamePotUserInfo)obj;
}
});
}
@Override
public void onMainternance(GamePotAppStatus status) {
// 점검 중. 아래 API를 호출하면 SDK 자체에서 팝업을 표시할 수 있습니다.
// Customizing을 하고자 하는 경우아래 API를 호출하지 않은 상태에서 Customizing을 수행해 주십시오.
GamePot.getInstance().showAppStatusPopup(MainActivity.this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// showAppStatusPopup API를 호출한 경우 앱을 종료해야 하는 상황에 호출됩니다.
// 종료 프로세스를 처리해 주십시오.
MainActivity.this.finish();
}
});
}
@Override
public void onCancel() {
// 사용자가 로그인을 취소한 상황
}
@Override
public void onSuccess(GamePotUserInfo userinfo) {
// 로그인 완료. 게임 로직에 맞게 처리해 주십시오.
}
@Override
public void onFailure(GamePotError error) {
// 로그인 실패. error.getMessage()를 이용하여 오류 메시지를 표시해 주십시오.
}
@Override
public void onGameServiceConflict(GamePotUserInfo conflictUserInfo) {
// GPGS 계정 연동을 사용하는 경우 발생할 수 있는 이벤트입니다.
}
});
```
## 원격 구성 기능
대시보드의 **게임 > 원격구성**메뉴에 등록한 서버 매개변수 값을 가져올 수 있습니다. 매개변수 값을 가져와 SDK에서 사용하면 게임을 업데이트하지 않고 각 요소를 수정 및 제어할 수 있습니다.
가져온 매개변수는 로그인 시점에 로드되며, 그 이후부터 호출할 수 있습니다.
원격 구성 기능을 사용하려면 아래 코드를 사용하세요.
```
import io.gamepot.common.GamePot;
//key : 매개변수 string
String str_value = GamePot.getInstance().getConfig(key);
//대시보드에 추가한 모든 매개변수를 json string 형태로 가져옵니다.
String json_value = GamePot.getInstance().getConfigs();
```
## 게임 로그 전송 기능
게임 로그를 호출하여 대시보드의 **게임 > 플레이어** 메뉴에서 확인할 수 있습니다.
게임 로그 전송 기능을 사용하려면 표를 참조하여 아래 코드에 예약어를 입력한 후 코드를 호출해 주십시오.
- **예약어 및 코드**
| 예약어 | 필수 여부 | 타입 | 설명 | 최대 길이 |
| --- | --- | --- | --- | --- |
| `GamePotSendLogCharacter.NAME` | 필수 | `String` | 캐릭터명 | 128 |
| `GamePotSendLogCharacter.LEVEL` | 선택 | `String` | 레벨 | 128 |
| `GamePotSendLogCharacter.SERVER_ID` | 선택 | `String` | 서버 ID | 128 |
| `GamePotSendLogCharacter.PLAYER_ID` | 선택 | `String` | 캐릭터 ID | 128 |
| `GamePotSendLogCharacter.USERDATA` | 선택 | `String` | ETC | 128 |
```
import android.text.TextUtils;
import io.gamepot.common.GamePotSendLogCharacter;
import io.gamepot.common.GamePotSendLog;
String name = "캐릭터명";
String level = "10";
String serverid = "svn_001";
String playerid = "283282191001";
String userdata = "";
GamePotSendLogCharacter obj = new GamePotSendLogCharacter();
if(!TextUtils.isEmpty(name))
obj.put(GamePotSendLogCharacter.NAME, name);
if(!TextUtils.isEmpty(level))
obj.put(GamePotSendLogCharacter.LEVEL, level);
if(!TextUtils.isEmpty(serverid))
obj.put(GamePotSendLogCharacter.SERVER_ID, serverid);
if(!TextUtils.isEmpty(playerid))
obj.put(GamePotSendLogCharacter.PLAYER_ID, playerid);
if(!TextUtils.isEmpty(playerid))
obj.put(GamePotSendLogCharacter.USERDATA, userdata);
// result : 로그 전송 성공 true, 그렇지 않으면 false
boolean result = GamePotSendLog.characterInfo(obj);
```
## AppStatus 확인
현재 클라이언트의 AppStatus를 확인하려면 아래 코드를 사용해 주십시오. ( 로그인 전 점검 / 업데이트 상태 확인 )
```
import io.gamepot.common.GamePot;
GamePot.getInstance().checkAppStatus(new GamePotAppStatusResultListener() {
@Override
public void onSuccess(){
}
@Override
public void onFailure(GamePotError error){
}
@Override
public void onNeedUpdate(GamePotAppStatus status){
// 강제 업데이트 필요. 아래 API를 호출하면 SDK 자체 팝업을 표시할 수 있습니다.
// Customizing을 하고자 하는 경우 아래 API를 호출하지 않은 상태에서 Customizing을 수행해 주십시오.
GamePot.getInstance().showAppStatusPopup(MainActivity.this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// showAppStatusPopup API를 호출한 경우 앱을 종료해야 하는 상황에 호출됩니다.
// 종료 프로세스를 처리해 주십시오.
MainActivity.this.finish();
}
@Override
public void onNext(Object obj) {
// 대시보드 업데이트 설정에서 권장 설정 시 "다음에 하기" 버튼이 표시됩니다.
// 해당 버튼을 사용자가 선택하면 표시됩니다.
// obj 정보를 이용하여 로그인 완료 시와 동일하게 처리해 주십시오.
// GamePotUserInfo userInfo = (GamePotUserInfo)obj;
}
});
}
@Override
public void onMainternance(GamePotAppStatus status){
// 점검 중. 아래 API를 호출하면 SDK 자체에서 팝업을 표시할 수 있습니다.
// Customizing을 하고자 하는 경우아래 API를 호출하지 않은 상태에서 Customizing을 수행해 주십시오.
GamePot.getInstance().showAppStatusPopup(MainActivity.this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// showAppStatusPopup API를 호출한 경우 앱을 종료해야 하는 상황에 호출됩니다.
// 종료 프로세스를 처리해 주십시오.
MainActivity.this.finish();
}
});
}
});
```
### setUserData설정
로그인 후 해당 회원에 추가 정보를 넣고자 할때 사용해주세요. key 최대 갯수 50개 제한 value 최대 길이 1024 제한 해당 정보는 회원 상세 항목에서만 확인이 가능합니다.
```
import io.gamepot.common.GamePot;
JSONObject jobj = new JSONObject();
try {
jobj.put("appversion", "1.0.23");
jobj.put("server", "s1");
} catch (JSONException e1) {
e1.printStackTrace();
}
GamePot.getInstance().setUserData(jobj, new GamePotCommonListener() {
@Override
public void onSuccess() {
//setUserData 성공
}
@Override
public void onFailure(GamePotError error) {
//setUserData 실패
}
});
```
## 3rd Party SDK 연동
GAMEPOT 안드로이드 SDK는 3rd Party SDK와의 연동을 지원합니다.
### 3rd Party SDK 로그인 연동
3rd Party SDK와 연동하여 로그인 기능을 사용하려면 표를 참조하여 아래 코드의 값을 수정한 후 코드를 사용해 주십시오.
- **파라미터 및 코드**
| 파라미터명 | 필수 여부 | 타입 | 설명 |
| --- | --- | --- | --- |
| `activity` | 필수 | `String` | 현재 Activity |
| `userid` | 필수 | `String` | 사용자 고유 ID |
| `listener` | 필수 | `GamePotChannelListener / GamePotAppStatusChannelListener` | 요청 결과 |
```
String memberId = "memberid of 3rd party sdk";
GamePotChannel.getInstance().loginByThirdPartySDK(getActivity(), memberId, new GamePotAppStatusChannelListener() {
@Override
public void onNeedUpdate(GamePotAppStatus status) {
// 강제 업데이트 필요. 아래 API를 호출하면 SDK 자체 팝업을 표시할 수 있습니다.
// Customizing을 하고자 하는 경우 아래 API를 호출하지 않은 상태에서 Customizing을 수행해 주십시오.
GamePot.getInstance().showAppStatusPopup(MainActivity.this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// showAppStatusPopup API를 호출한 경우 앱을 종료해야 하는 상황에 호출됩니다.
// 종료 프로세스를 처리해 주십시오.
MainActivity.this.finish();
}
@Override
public void onNext(Object obj) {
// 대시보드에서 업데이트 설정을 권장으로 지정했을 경우 "다음에 하기" 버튼이 표시됩니다.
// 해당 버튼을 사용자가 선택하면 호출됩니다.
// obj 정보를 이용하여 로그인 완료 시와 동일하게 처리해 주십시오.
// GamePotUserInfo userInfo = (GamePotUserInfo)obj;
}
});
}
@Override
public void onMainternance(GamePotAppStatus status) {
// 점검 중. 아래 API를 호출하면 SDK 자체에서 팝업을 표시할 수 있습니다.
// Customizing을 하고자 하는 경우 아래 API를 호출하지 않은 상태에서 Customizing을 수행해 주십시오.
GamePot.getInstance().showAppStatusPopup(MainActivity.this, status, new GamePotAppCloseListener() {
@Override
public void onClose() {
// showAppStatusPopup API를 호출한 경우 앱을 종료해야 하는 상황에 호출됩니다.
// 종료 프로세스를 처리해 주십시오.
MainActivity.this.finish();
}
});
}
@Override
public void onCancel() {
// 사용자가 로그인을 취소한 상황
}
@Override
public void onSuccess(GamePotUserInfo userinfo) {
// 로그인 완료. 게임 로직에 맞게 처리해 주십시오.
}
@Override
public void onFailure(GamePotError error) {
// 로그인 실패. error.getMessage()를 이용해서 오류 메시지를 표시해 주십시오.
}
@Override
public void onGameServiceConflict(GamePotUserInfo conflictUserInfo) {
// GPGS 계정 연동을 사용하는 경우 발생할 수 있는 이벤트입니다.
}
});
```
### 3rd Party SDK 결제 연동
3rd Party SDK와 연동하여 결제 기능을 사용하려면 표를 참조하여 아래 코드의 값을 수정한 후 코드를 사용해 주십시오.
- **파라미터 및 코드**
| 파라미터명 | 필수 여부 | 타입 | 설명 |
| --- | --- | --- | --- |
| `productid` | 필수 | `String` | 대시보드에 등록된 아이템 ID |
| `transactionid` | 필수 | `String` | 결제 영수증 번호(GPA-xxx-xxxx-xxxx) |
| `currency` | 선택 | `String` | 통화(KRW,USD) |
| `price` | 선택 | `double` | 결제 아이템 금액 |
| `paymentid` | 선택 | `String` | 결제 스토어(`google`, `apple`, `one`, `galaxy`) |
| `uniqueid` | 선택 | `String` | 개발사에서 사용하는 고유 ID |
| `listener` | 선택 | `GamePotListener` | 요청 결과 |
```
String productId = "purchase_001";
String transactionId = "GPA-xxx-xxxx-xxxx";
String currency = "KRW";
double price = 1200;
String paymentId = "google";
String uniqueId = "developer unique id";
GamePot.getInstance().sendPurchaseByThirdPartySDK(productId, transactionId, currency, price, paymentId, uniqueId, null);
```
## ELSA 로그 수집
ELSA 와 연동하여 로그를 수집 기능을 사용하려면 아래 코드를 호출해 주십시오.
```
// initialize
GamePotLogger.init(Application application);
// debug
GamePotLogger.d(String errorCode, String message)
// info
GamePotLogger.i(String errorCode, String message)
// warn
GamePotLogger.w(String errorCode, String message)
// error
GamePotLogger.e(String errorCode, String message)
```
아래는 호출 예시입니다.
```
@Override
public void onFailure(GamePotError error) {
GamePotLogger.e(Integer.toString(error.getCode()), error.getMessage());
}
```