# Android

## Quick Start

最新バージョンダウンロード

{% embed url="<https://github.com/naver/navergame-sdk-android/archive/refs/tags/1.3.1.zip>" %}

### **サンプルプロジェクト実行**

NAVERゲームSDKのサンプルプロジェクトをAndroid Studioで実行する方法は以下のとおりです。

1. &#x20;**sample/navergame-sdk-sample-android-studio**フォルダ内のプロジェクトをAndroid Studioで開く。
2. プロジェクトをビルドする。
3. アプリケーションでSDKが正常実行されるのを確認する。

## **NaverGame SDK環境設定**

### **1. アプリマニフェスト設定**

**AndroidManifest.xml**ファイルに以下のようにアクセス権限とアクティビティを追加してください。

**1.1 NaverGame SDKのアクセス権限**

NaverGame SDKに必要なアクセス権限を追加します。

```
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```

### **2. Gradle設定**

SDKを使用するmodule単位のbuild.gradleに設定します。

#### **2.1 PlugIn設定**

* NaverGameSdkはkotlinを使用します。
* plugins宣言区間に以下のようにKotlinプログインを宣言してください。

```
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}
```

#### **2.2 ライブラリ追加**

* ​<https://github.com/naver/navergame-sdk-android/releases>で最新のライブラリファイルをダウンロードすることができます。
* プロジェクトフォルダにlibsフォルダを作成して、ダウンロードしたnavergame-sdk-gradle-XXX.aarファイルを貼り付けてください。
* Android Studio用aarライブラリは、dependencyクラッシュを防止するためgradleで外部ライブラリを管理するバージョンです。
* libsフォルダの構造は、gradleのバージョンとプロジェクトの設定によって異なりますが、基本的にsrcフォルダと同じ場所に入っていれば問題ありません。

#### **2.3 Dependency設定**

* NaverGameSdkが使用するライブラリを追加します。
* Dependency宣言区間に以下のようにライブラリを追加してください。
* **glideライブラリとretrofitライブラリは他のバージョンとの互換性がないため**、NaverGameSDKのバージョン名を維持してください。
* glide、retrofitライブラリが、使用する他のライブラリとクラッシュを起こす場合は、ライブラリでプロジェクトを分離するとdependencyを維持することができます。

```
dependencies {
    implementation files('libs/navergame-sdk-gradle-x.x.x.aar')            // NaverGameSDK
    
    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.3.72"            // Kotlin
    implementation "androidx.viewpager2:viewpager2:1.0.0"
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" 
    implementation "com.github.bumptech.glide:glide:3.7.0"                // Glide
    implementation "com.squareup.retrofit2:retrofit:2.7.2"                // Retrofit, Gson
    implementation "com.squareup.retrofit2:converter-gson:2.7.2"          // Retrofit, Gson
}
```

### **3. ProGuard設定**

NaverGame SDKを使用時にminifyEnabledをtrueに設定する場合は、ProGuardを除いたオプションを追加する必要があります。

* proguard-rules.proファイルを開いて以下の内容を入力してください。
* ProGuard宣言は重複しても問題ないので、手軽に貼り付けると良いでしょう。
* 当該ファイルはGitHubのNaverGameSDKページでも[ダウンロード](https://github.com/naver/navergame-sdk-android/blob/master/sample/navergame-sdk-sample-android-studio/app/proguard-rules.pro)できます。

```
#retrofit 2

# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod

# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations

# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}

# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**

# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit

# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions


#end of retrofit2

#gson
##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }



# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

##---------------End: proguard configuration for Gson  ----------
#end of gson

#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
#end of glide

#kotlin
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
    <fields>;
}
-keepclassmembers class kotlin.Metadata {
    public <fields>;
    public <methods>;
}
#End of kotlin

#navergame sdk
# Application classes that will be serialized/deserialized over Gson
-keep class com.navercorp.nng.android.sdk.api.service** { *; }
-keep class com.navercorp.nng.android.sdk.api.entity.** { *; }

-keep class com.navercorp.nng.android.sdk.NNGLink** { *; }
-keep class com.navercorp.nng.android.sdk.NNGLink$Companion { *; }
-keepclassmembers class com.navercorp.nng.android.sdk.NNGLink {
    public static ** Companion;
}
-keep class com.navercorp.nng.android.sdk.NNGConfig** { *; }


#end of sdk
```

### **4. 初期化**

NaverGame SDKの対応言語によって、以下のとおりNaverGame SDKを初期化してください。

#### **4.1 NaverGame SDKの初期化**

NaverGame SDKを初期化するときは、以下のように初期化オプションを設定してinit()メソッドを呼び出してください。

init()メソッドは、PLUG SDKを初期化するメソッドです。

* ClientId: [NAVER IDでログイン開発者センター](https://developers.naver.com/products/login/api)にアプリケーションを登録時に受け取ったクライアントID
* ClientSecret: [NAVER IDでログイン開発者センター](https://developers.naver.com/products/login/api)にアプリケーションを登録時に受け取ったクライアントシークレット
* LoungeId: 公式ラウンジを申請時に受け取ったLoungeId

```
public class MainActivity extends Activity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /**
     * 네이버 아이디로 로그인 개발자 센터에서 받은 정보로 SDK를 초기화한다.
     * Glink 클래스의 다른 메서드를 호출하기 전에 반드시 초기화를 먼저 해야 한다.
     * 개발자 센터 주소: https://nid.naver.com/devcenter/main.nhn
     */
    final String loungeId = "naver_game_4developer"";
    final String clientId = "197CymaStozo7X5r2qR5";
    final String clientSecret = "evCgKH1kJL";
    NNGLink.initModule(this, loungeId, clientId, clientSecret );
    ...
}
```

### **5. NaverGame SDK開始**

初期化が完了したら、NaverGame SDKを実行してください。

#### **5.1 startHome()メソッド**

startHome()メソッドはホームバナーを始めるメソッドです。

```
/**
* 홈배너 실
*/
NNGLink.startHome(activity)
```

## **NaverGameSDKの使用**

### **initModule()メソッド**

SDKを初期化します。

```
public static void initModule
    (Activity activity, String loungeId, String clientId, String secret);
```

以下はinitModule()メソッドを実装した例です。

```
final String loungeId = "naver_game_4developer"";
final String clientId = "UKvNABLDsyEJusJGsXL2";
final String clientSecret = "rK4suc_Qd0";
NNGLink.initModule(this, loungeId, clientId, clientSecret );
```

### **finishSdk()メソッド**

finishSdk()メソッドは、NaverGameSDKを終了させるメソッドです。特定の状況でsdkを終了させる必要がある場合に呼び出します。例えば、GLinkDelegateコールバックを通じて送信されるインゲームメニューコードを実行するときには、必ずfinishSdk()メソッドを呼び出してsdkを閉じなければなりません。

```
public static void finishSdk();
```

### **startHome()メソッド**

ホームバナーを実行します。

```
public static void startHome(Activity activity);
```

以下はstartHome()メソッドを実装した例です。

```
   /**
   * 홈 배너 시작
   */
  NNGlink.startHome(activity)
```

### **startSorry()メソッド**

点検用または共通のお知らせを単独で表示させます。

```
public static void startSorry(final Activity activity);
```

以下はstartSorry()メソッドを実装した例です。

```
   /**
   * 점검용 배너 시작 
   */
  NNGLink.startSorry(activity)
```

### **startBoard(int boardId)メソッド**

**公式ラウンジ管理ページ** > **SDK管理** **> 掲示板管理**ページで登録した特定の掲示板を直接実行させるメソッドです。

```
public static void startBoard(final Activity activity, int boardId);
```

以下はexecuteBoard()メソッドを実装した例です。

```
NNGLink.startBoard(activity,1)
```

**​**

### **startFeed(long feedId, bool isTempFeedId)メソッド**

登録された投稿の番号で直接実行するメソッドです。**予約機能によって登録された予約投稿**の場合は、予約投稿の番号をFeedIDに入力してIsTempFeedIdを**True**と入力してください。

予約投稿が掲示されるまでは、メソッドを実行しても投稿は表示されません。

* FeedId: 投稿または予約投稿の番号
* IsTempFeedId: FeedIdが投稿の場合はfalse、FeedIdが予約投稿の場合はtrue

```
public static void startFeed(final Activity activity, long feedId, boolean isTempFeedId);
```

以下はexecuteFeed()メソッドを実装した内容です。

```
NNGLink.startFeed(activity,50154,false)
```

**​**

### **getCountryCode()メソッド**

Android機器のcountryCodeを取得します。

```
public static String getCountryCode(Activity activity);
```

countryCodeは2文字のアルファベットで構成された国コード([ISO 3166-1 alpha-2](https://ko.wikipedia.org/wiki/ISO_3166-1_alpha-2))です。これを活用すると、コード内で国別に分岐処理することができます。主な国コードは以下のとおりです。その他の国コードは[リンク](https://ko.wikipedia.org/wiki/ISO_3166-1_alpha-2)をご参考にしてください。

| 国コード | 国  |
| ---- | -- |
| CN   | 中国 |
| JP   | 日本 |
| KR   | 韓国 |
| TH   | タイ |
| US   | 米国 |

以下はgetCountryCode()メソッドを使用して韓国の場合にのみSDKを初期化してバナーを呼び出す例です。

```
if (NNGLink.getCountryCode(getActivity()).equals("KR")) {
    NNGLink.initModule(getActivity() ,LOUNGE_ID, CLIEND_ID, CLIENT_SECRET);
    NNGLink.startHome(getActivity());
}
```

## **NNGCallbackListenerコールバックリスナー**

Sdk内部で特定のイベントが発生した場合、コールバックリスナーを通じて伝達します。

登録方法は以下のとおりです。

```
NNGLink.setSdkLoadListener(new NNGCallbackListener() {
        @Override
        public void onSdkDidLoaded() {
            nngSdkLoaded();
        }

        @Override
        public void onSdkDidUnloaded() {
            nngSdkUnLoaded();
        }

        @Override
        public void onCallInGameMenuCode(@NotNull String moveTo) {
            nngSdkCallInGameMenuCode(moveTo);
        }
    });
```

### **onSdkDidLoaded()メソッド**

NaverGameSdkが実行されたときに発生します。

### **onSdkDidLoaded()メソッド**

NaverGameSdkが終了したときに発生します。

### **onCallInGameMenuCode()メソッド**

NaverGameSdkでインゲームメニューコードを実行する必要があるときに発生します。**公式ラウンジの管理ページ** > **SDK管理** **> バナー管理**ページでバナー&#x306B;**「インゲームメニュー」**&#x3092;登録したときに使用します。AndroidとiOSの各プラットフォームによって登録した値が各自伝達されるため、他の値を入力した場合は各自処理しなければなりません。

## ​**横モード、縦モード**

Naver Game SDKは、横モードと縦モードのどちらにも対応しています。

Android環境では、別途に設定しなくても画面の縦横状態によって横モード、縦モードが自動的に適用されます。

&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://navergame.gitbook.io/naver-game/japanese/integration-guide/android.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
