# Android 用のカスタムアダプタのビルド

> ネットワーク用のカスタムアダプタを開発して Android プラットフォームに統合します (必要な設定やテスト手順など)。

このドキュメントでは、カスタムアダプターをビルドし、ネットワークを Ironsource メディエーションと統合するために必要なリソースをパブリッシャーに提供する手順について説明します。

## 前提条件

1. カスタム アダプター登録[フォーム](/grow/levelplay/sdk/android/custom-adapters.md.md)への記入
2. 以下の情報が入手可能であることを確認します。
   * Adapter パッケージ名
   * Adapter クラス名
   * ネットワーク設定キー
3. 最新の LevelPlay SDK のダウンロード[は こちら](/grow/levelplay/sdk/android/sdk-integration.md.md)
4. 動画リワード広告ユニットとインタースティシャル広告ユニットに最低限必要な LevelPlay SDK バージョンは 7.1.13。

> **Note:**
>
> Android および Unity 開発プロジェクトの場合、最低限必要な LevelPlay SDK
> version is 7.3.0 for banner ad unit (バナー広告単位のバージョンは 7.3.0)

### 重要

* 必ずコードの一部としてメインスレッド要件をハンドルするようにしてください
* コード保護と例外処理を追加して、予期しない障害からアプリケーションを保護する

## ネットワーク用のアダプタの作成方法

ネットワーク アダプタがネットワーク広告ロジックを管理し、パブリッシャーが Ironsource メディエーションを使用してネットワークから広告を表示できるようにします。

このプロセスの一環として、BaseAdapter と呼ばれるアダプタークラスと、サポートする各広告単位に追加のクラスを作成する必要があります。

BaseAdapter は、SDK の初期化プロセスを含むネットワークワークの SDK を管理するのにヘルプます。また、すべての広告ユニットのセッションを通じて使用できる変数と定数を定義できます。

広告単位クラスは、広告のロード、表示、および管理のロジックを決定し、ウォーターフォールの広告表示ごとにインスタンス化されます。

## ネットワークベースアダプタの作成

ネットワークアダプタを実装するには、ironsource **BaseAdapter** クラスを拡張して専用パッケージに新しいクラスを作成します。

カスタムアダプタ登録確認メールで受け取った**パッケージ**名と**ベースアダプタ**名を使用します。

```java
package com.ironsource.adapters.custom.<YourNetworkName>;
public class <YourNetworkName>CustomAdapter extends BaseAdapter {
   // Your class implementation
}
```

### ネットワークSDKの初期化

ironsource メディエーションは、メディエーションの初期化プロセスの一環としてベースアダプタの init API を呼び出します。その結果、この API が複数回呼び出される可能性があります。

init 実装の一部として、NetworkInitializationListener で定義された初期化コールバックを、成功 （onInitSuccess） または失敗 （onInitFailed） するたびに呼び出してください。

**AdData** パラメータには、パブリッシャーが Ironsource に提供した設定データが含まれます。AdDataクラスの詳細については[、こちら](/grow/levelplay/sdk/android/custom-adapters.md.md)を参照してください。

```java
void init(@NotNull AdData adData, @NotNull Context context, @Nullable NetworkInitializationListener listener)
{
   ...
   if (init-success-condition) {
      // Initialization completed successfully
      listener.onInitSuccess();
   } else {
     // Initialization failed
     listener.onInitFailed(AdapterErrors.ADAPTER_ERROR_MISSING_PARAMS, error);
   }
}
```

### SDK とアダプターのバージョンを提供する

この情報は、パブリッシャーのアプリケーションに現在実装されている SDK とアダプタのバージョンを示します。getNetworkSDKVersion を実装する場合は、アダプタの更新と SDK サポートの柔軟性を高めるために、ハードコードされた値の代わりに API を使用することをお勧めします。

```java
@Nullable String getNetworkSDKVersion();
@NotNull String getAdapterVersion();
```

## インタースティシャル広告単位のサポートを追加

### インタースティシャル広告単位クラスの作成

インタースティシャル広告単位を管理するクラスを作成します。ネットワークのカスタムアダプタの同じパッケージの一部として **BaseInterstitial** クラス\*\* を拡張します。このクラスは、パブリッシャーがロード API を通じてアプリケーション内の新しいインタースティシャル広告をトリガーしたときにアクティブになります。

登録プロセスの一部として Ironsource から受け取ったパッケージとインタースティシャルクラス名を使用します。

```java
パッケージ com.Ironsource.adapters.custom.[YourNetworkName];
public class SampleCustomInterstitial extends BaseInterstitial<SampleCustomAdapter> implements SampleNetworkInterstitialAdListener {
public class <YourNetworkName>CustomInterstitial extends
BaseInterstitial <<YourNetworkNameCustomAdapter>> {
...
}
```

### 広告単位コンストラクタの実装

NetworkSetting オブジェクトを使用してコンストラクターを実装します。これはインタースティシャル広告単位の実装の一部として必要であり、ネットワークワークをウォーターフォールに追加できるようにします。

```java
public <YourNetworkName>CustomInterstitial(NetworkSettings networkSettings) {
   super(networkSettings);
}
```

### インタースティシャル広告のリクエスト

LoadAd API をオーバーライドして、パブリッシャーがネットワークからインタースティシャル広告をリクエストできるようにします。[AdData](/grow/levelplay/sdk/android/custom-adapters.md.md) を使用すると、パブリッシャーの入力にアクセスし、広告識別子を受け取ることができます。

InterstitialAdListener コールバックは、広告のロードの成功 （onAdLoadSuccess） とあらゆる種類の失敗 （onAdLoadFailed） に対して必ず実装してください。リスナーコールバックが事前に定義された時間が経過してもトリガーされない場合、瞑想はロードを停止し、ネットワークワークは広告を提供できなくなります。

```java
public void loadAd(AdData adData, Activity activity, InterstitialAdListener listener) {

   // Load your ad
}
```

### 広告が利用可能かどうかの確認

isAdAvailable APIをオーバーライドして、パブリッシャーがユーザーに広告を表示する前に広告の準備状況を確認できるようにします。API は、広告が正常にロードされた場合は true、現在ロードされている広告がない場合は false を返します。これを行うには、ネットワークの is-ad-available (広告が利用可能な状態) 表示を使用するか (ネットワークで提供されている場合)、LoadAd および ShowAd API の一部として広告の状態を手動で管理します。

```java
public boolean isAdAvailable(AdData adData) {
   return isAdAvailable;
}
```

### インタースティシャル広告を表示する

広告が正常にロードされると、パブリッシャーはそれを表示できるようになります。isAdAvailable が true であることを確認した後に showAd API をオーバーライドして、パブリッシャーにより良い体験を提供できます。このメソッドで受け取る情報の一部[は AdData](/grow/levelplay/sdk/android/custom-adapters.md.md) です。このオブジェクトを使用すると、関連する広告を表示できます。ショーを実行できなかった場合は、onAdShowFailed コールバックが返されます。

```java
public void showAd(AdData adData, InterstitialAdListener listener) {

   // check your ad load status
   if (isAdLoaded)  {
      // show your ad

   } else {
      listener.onAdShowFailed(adatperErrorCode, adapterErrorMsg);
   }
}
```

### InterstitialAdListener コールバックのレポート

必ず、ネットワークの機能に応じて InterstitialAdListener のコールバックをオーバーライドしてください。コールバックを正しくレポートすることで、Ironsource メディエーションのベストプラクティスフローが保証され、ネットワークワークのパフォーマンデータが Ironsource プラットプラットフォームに正しく反映されるようになります。

#### 必須のコールバック

```java
// Indicates that interstitial ad was loaded successfully
void onAdLoadSuccess();

// The interstitial ad failed to load.ironsource ErrorType の使用 (塗りつぶしなし/その他)
void onAdLoadFailed(@NotNull AdapterErrorType adapterErrorType, int errorCode, @Nullable String errorMessage);

// The interstitial ad is displayed successfully to the user.これはインプレッションを示します。
void onAdOpened();

// User closed the interstitial ad
void onAdClosed();

// The ad could not be displayed
void onAdShowFailed(int errorCode, @Nullable String errorMessage);
```

#### 任意コールバック

```java
// Indicates the network differentiates between show-success and ad-open (impression)
void onAdShowSuccess();

// Indicates an ad was clicked
void onAdClicked();
```

### ベースアダプタからデータを取得する方法(任意)

ベースアダプターがセッションを通じて広告ユニットに関連する状態またはパラメーターを管理する場合は、getNetworkAdapter API を使用します。これには、広告単位 API で使用する必要があるベースアダプタの一部として定義されたすべてのオブジェクトが含まれます。

```java
// example of data retrieved from your network level adapter
SampleCustomAdapter networkAdapter = getNetworkAdapter();

if (networkAdapter != null) {

   // call network level method
   String extraData = networkAdapter.sampleAppLevelData();

}
```

## 動画リワード広告単位のサポートを追加

### 動画リワード広告単位クラスの作成

**BaseRewardedVideo** クラス\*\*をネットワークのカスタム アダプタの同じパッケージの一部として拡張することによって、動画リワード広告単位を管理するクラスを作成します。このクラスは、パブリッシャーがロード API を通じてアプリケーションで新しい動画リワード広告をトリガーしたときにアクティブになります。

登録プロセスの一環として Ironsource から受け取ったパッケージと動画リワード クラス名を使用します。

```java
パッケージ com.Ironsource.adapters.custom.[YourNetworkName];
import com.ironsource.mediationsdk.adunit.adapter.BaseRewardedVideo;
import com.ironsource.mediationsdk.adunit.adapter.listener.RewardedVideoAdListener;
import com.ironsource.mediationsdk.adunit.adapter.utility.AdData;
import com.ironsource.mediationsdk.adunit.adapter.utility.AdapterErrorType;
import com.ironsource.mediationsdk.adunit.adapter.utility.AdapterErrors;
import com.ironsource.mediationsdk.model.NetworkSettings;
```

```java
public class SampleCustomRewardedVideo extends BaseRewardedVideo<SampleCustomAdapter> implements SampleNetworkRewardedVideoListener {
   // Add your adapter code here
}
```

### 広告単位コンストラクタの実装

NetworkSetting オブジェクトを使用してコンストラクターを実装します。これは動画リワード広告単位の実装の一部として必要であり、ネットワークをウォーターフォールに追加できるようにします。

```java
public <YourCustomNetwork>CustomRewardedVideo(NetworkSettings networkSettings) {
        super(networkSettings);
}
```

### 動画リワード広告のリクエスト

LoadAd API をオーバーライドして、パブリッシャーがネットワークから動画リワード広告をリクエストできるようにします。[AdData](/grow/levelplay/sdk/android/custom-adapters.md.md) を使用すると、パブリッシャーの入力にアクセスし、広告識別子を受け取ることができます。

RewardedVideoAdListener コールバックは、広告のロードの成功時（onAdLoadSuccess）とすべての種類の失敗時（onAdLoadFailed）に必ず実装してください。リスナーコールバックが事前に定義された時間が経過してもトリガーされない場合、瞑想はロードを停止し、ネットワークワークは広告を提供できなくなります。

```java
public void loadAd(@NotNull AdData adData, @NotNull Activity activity, @NotNull RewardedVideoAdListener rewardedVideoAdListener) {
   // Load your ad
}
```

### 広告が利用可能かどうかの確認

isAdAvailable APIをオーバーライドして、パブリッシャーがユーザーに広告を表示する前に広告の準備状況を確認できるようにします。API は、広告が正常にロードされた場合は true、現在ロードされている広告がない場合は false を返します。これを行うには、ネットワークの is-ad-available (広告が利用可能な状態) 表示を使用するか (ネットワークで提供されている場合)、LoadAd および ShowAd API の一部として広告の状態を手動で管理します。

```java
public boolean isAdAvailable(AdData adData) {
   return isAdAvailable;
}
```

### 動画リワード広告を表示する

広告が正常にロードされると、パブリッシャーはそれを表示できるようになります。isAdAvailable が true であることを確認した後に showAd API をオーバーライドして、パブリッシャーにより良い体験を提供できます。このメソッドで受け取る情報の一部[は AdData](/grow/levelplay/sdk/android/custom-adapters.md.md) です。このオブジェクトを使用すると、関連する広告を表示できます。ショーを実行できなかった場合は、onAdShowFailed コールバックが返されます。

```java
public void showAd(AdData adData, RewardedVideoAdListener rewardedVideoAdListener) {

   // check your ad load status
   if (isAdLoaded)  {
      // show your ad

   } else {
      AdapterErrors adapterErrorCode = AdapterErrors.<ERROR CODE>;
      文字列 adapterErrorMsg = “ERROR MESSAGE”; rewardedVideoAdListener.onAdShowFailed(adatperErrorCode, adapterErrorMsg);
   }
}
```

#### RewardedVideoAdListener コールバックのレポート

必ず、ネットワークの機能に応じて RewardedVideoAdListener のコールバックをオーバーライドしてください。コールバックを正しくレポートすることで、Ironsource メディエーションのベストプラクティスフローが保証され、ネットワークワークのパフォーマンデータが Ironsource プラットプラットフォームに正しく反映されるようになります。

#### 必須のコールバック

```java
// Indicates that rewarded video ad was loaded successfully
void onAdLoadSuccess();
// The rewarded video ad failed to load.ironsource ErrorType の使用 (塗りつぶしなし/その他)
void onAdLoadFailed(@NotNull AdapterErrorType adapterErrorType, int errorCode, @Nullable String errorMessage);
// The rewarded video ad is displayed successfully to the user.ironsource プラットフォームでのインプレッションを示します。
void onAdOpened();
// User closed the rewarded video ad
void onAdClosed();
// The ad could not be displayed
void onAdShowFailed(int errorCode, @Nullable String errorMessage);
// The ad was rewarded successfully
void onAdRewarded();

```

#### 任意コールバック

```java
// Indicates an ad was clicked
void onAdClicked();
// Indicates an ad was displayed on foreground
void onAdVisible();
// Indicates an ad playable started
void onAdStarted();
// Indicates an ad playable ended
void onAdEnded();
```

## バナー広告単位のサポートを追加（Android開発アプリケーションのみ）

### **ステップ 1.Create バナー広告単位クラス**

ネットワークのカスタム アダプタの同じパッケージの一部として **BaseBanner** クラスを拡張することによって、バナー広告単位を管理するクラスを作成します。このクラスは、パブリッシャーが API のロードを通じてアプリケーションで新しいバナー広告をトリガーしたときにアクティブになります。

登録プロセスの一環として Ironsource から受け取ったパッケージとバナーのクラス名を使用します。

### ステップ 2. 広告単位コンストラクタの実装

NetworkSetting オブジェクトを使用してコンストラクターを実装します。これはバナー広告単位の実装の一部として必要であり、ネットワークをウォーターフォールに追加できるようにします。

```java
public <YourNetworkName>CustomBanner(NetworkSettings networkSettings) {
   super(networkSettings);
}
```

#### バナーサイズ

サポートされているバナーサイズの詳細については、以下の表を参照してください。カスタムネットワークは、これらのサイズの任意の組み合わせをサポートできます。バナーサイズは、loadAd API の一部としてパラメーターとして受け取ります。

バナーのサイズが **SMART** の場合は、デバイスの画面サイズに応じてサイズを**バナー**または**リーダー**ボードのいずれかに変更してください (以下の手順を参照)。

| **ISBannerSize** | **説明**                        | **寸法 (dp) (幅 x 高さ)**                              |
| ---------------- | ----------------------------- | ------------------------------------------------- |
| **BANNER**       | 標準バナー                         | 320×50                                            |
| **LARGE**        | Large バナー                     | 320 x 90                                          |
| **矩形**           | 中矩形 (MREC)                    | 300 x 250                                         |
| **SMART**        | スマートバナー (モバイルとタブレットの両方用に調整済み) | If (画面幅 720 未満) 320 x 50 If (画面幅 720 未満) 728 x 90 |

### ステップ 3. バナー広告をリクエストします

loadAd API を実装して、パブリッシャーがネットワークからバナー広告をリクエストできるようにします。[AdData](/grow/levelplay/sdk/android/custom-adapters.md.md) を使用すると、パブリッシャーの入力にアクセスして広告識別子を受け取ることができます。ISBannerSize には要求されたバナーサイズが表示されます。

```java
public void loadAd(@NotNull AdData adData, @NotNull Activity activity, @NotNull ISBannerSize bannerSize, @NotNull BannerAdListener bannerAdListener) {
 // Load your ad
}
```

### ステップ 4. 破棄バナー

ironsource では、アプリケーション開発者が以下の destroyAd メソッドを実装してバナー広告を破棄する必要があります。

```java
 public void destroyAd(@NotNull AdData adData) {
    }
```

> **Note:**
>
> ネットワーク SDK がこの種の API をサポートしていない場合は、
> 実装。

### ステップ 5.BannerAdListener コールバックのレポート

ネットワークの機能に応じて BannerAdListener のコールバックをレポートします。これにより、ネットワークのパフォーマンス データが Ironsource プラットフォームに正しく反映されます。

#### 必須のコールバック

```java
// Indicates that a banner ad was loaded successfully
void onAdLoadSuccess(@NotNull View adView, @NotNull FrameLayout.LayoutParams frameLayoutParams)
// The banner ad failed to load.ironsource ErrorType の使用 (塗りつぶしなし/その他)
void onAdLoadFailed(@NotNull AdapterErrorType adapterErrorType, int errorCode, @Nullable String errorMessage)
// The banner ad is displayed successfully to the user.ironsource プラットフォームでのインプレッションを示します。
void onAdOpened()
// Indicates an ad was clicked
void onAdClicked()
```

カスタムアダプターでネットワークワークによって onAdLoadSuccess コールバックに渡される LayoutParams オブジェクトの値を定義します。以下はベストプラクティスです。

* 実際のバナーサイズの幅と高ささを渡します。
* 重力 プロパティを 重力.CENTER として定義します。

#### 任意コールバック

```java
//Should be invoked after a click, and before the user is taken out of the app
void onAdLeftApplication()
// Should be invoked after the ad view presents fullscreen content
void onAdScreenPresented()
// Should be invoked after the fullscreen content is dismissed
void onAdScreenDismissed()

```

## アダプターを使用してパブリッシャーの入力にアクセスする

カスタムアダプター登録プロセスの一環として、アプリケーションレベルとインスタンスレベルのキーを提供しました。

これらのキーの値は、ironsource プラットフォームのパブリッシャーによって定義されます。これらの値は、 AdData オブジェクトを使用して実行時に使用できます 。

AdData オブジェクトは、 設定値を含むマップを含み、 アダプタおよび広告単位クラス API の一部です 。このパラメーターは、Init、LoadAd、ShowAd、および isAdAvailable API で使用できます。

登録確認メールの一部として受け取った名前を使用して、AdData マップ構造体から値にアクセスできます。

```java
// Get Publisher setup parameters
final String appLevelParam1 = adData.getString(<YourAppLevelParam1>);
final String instanceLevelParam1 = adData.getString(<YourInstanceLevelParam1>);
final String instanceLevelParam2 = adData.getString(<YourInstanceLevelParam2>);
```

## ironsource エラーコードとエラータイプの使用

### エラータイプ

これは **onAdLoadFailed** コールバックに関連しています。

| エラータイプ                        | 説明                       |
| ----------------------------- | ------------------------ |
| `ADAPTER_ERROR_TYPE_NO_FILL`  | 表示できる広告がない場合に使用          |
| `ADAPTER_ERROR_TYPE_INTERNAL` | ネットワークによって報告されるその他の理由で使用 |

### エラーコード

これらのエラーコードは、**onAdLoadFailed** コールバックと **onAdShowFailed** コールバックに関連しています。

| エラーコード                         | 説明                                              |
| ------------------------------ | ----------------------------------------------- |
| `ADAPTER_ERROR_MISSING_PARAMS` | API が呼び出されたときに一部の必要な情報が利用できなかったため、アクションが失敗しました。 |
| `ADAPTER_ERROR_AD_EXPIRED`     | を使用して、広告の有効期限が切れたかどうかを示します。                     |
| `ADAPTER_ERROR_INTERNAL`       | ネットワークによって報告されたその他のエラーに使用されます。                  |

## アダプタのデバッグ（任意）

デバッグをサポートすることを選択した場合は、アプリケーションから setAdapterDebug API を実装して呼び出します。これは BaseAdapter の一部として行う必要があります。

```java
public class <YourNetworkName>CustomAdapter extends BaseAdapter {
   @Override
   public void setAdapterDebug(boolean adapterDebug) {
      this.adapterDebug = adapterDebug;
   }
}
```
