--- 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** ![game-gamepotandroid_ko](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/game-gamepotandroid_ko.png?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) - **EmailView** ![gamepot_android_09_1_ko](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/gamepot_android_09_1_ko.png?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) - **AgreeView** ![gamepot_android_09_2_ko](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/gamepot_android_09_2_ko.png?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) #### 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()); } ```