# Android 向けリワード広告インテグレーション

> LevelPlay SDK のリワード広告単位を統合するには、LevelPlayRewardedAdListener の実装、広告の可用性の初期化と確認、プレースメント付きの広告の表示、完了時のユーザーへの報酬付与、LevelPlay インテグレーションヘルパーによる設定の確認を行います。

Unity LevelPlay Rewardedは全画面の広告単位であり、通常はアプリケーションのライフサイクルにおける自然な遷移ポイントで提供されます。 

> **Note:**
>
> このドキュメントは SDK 8.5.0 以降に関連するものです。

## 前提条件##prerequisites

* LevelPlay SDK がアプリケーションに正しく統合されていることを確認します。インテグレーションの概要は[こちら](/grow/levelplay/sdk/android/sdk-integration.md)です。
* LevelPlay 初期化 API を使用して SDK を初期化していることを確認します。
* LevelPlay ダッシュボードで AdUnitID を見つけます。

## Rewarded Adオブジェクトの作成##create-rewarded-ad-object

リワード広告オブジェクトの作成は、**onInitSuccess** コールバックを受信した後に実行する必要があります。

オブジェクトは、セッションを通じて複数のロードと表示をハンドルできる再利用可能なインスタンスです。作成後、同じ広告単位の広告をロードおよび表示するために使用する必要があります。

より高度な実装では、必要に応じて複数のリワード広告オブジェクトを作成できます。

1. **Java**

   ```java
   LevelPlayRewardedAd mRewardedAd = new LevelPlayRewardedAd("adUnitId");
   ```

2. **Kotlin**

   ```kotlin
   val mRewardedAd = LevelPlayRewardedAd("adUnitId")
   ```

## リワードリスナーの設定##set-rewarded-listener

コードに **LevelPlayRewardedAdListener** を実装して、広告配信に関する情報を取得します。 

* リワード広告をロードする前にリスナーを設定することをお勧めします。
* 各リワード広告には、独自のリスナー実装が必要です。
* コールバックはメインスレッドで実行されます。

1. **Java**

   ```java
   // Rewarded ad オブジェクトを作成します
   LevelPlayRewardedAd mRewardedAd = new LevelPlayRewardedAd("adUnitId");
   mRewardedAd.setListener(new LevelPlayRewardedAdListener() {
   @Override
   public void onAdLoaded(LevelPlayAdInfo levelPlayAdInfo) {
      // 広告が正常にロードされました
   }
   @Override
   public void onAdLoadFailed(LevelPlayAdError levelPlayAdError) {
      // 広告ロード失敗 
   }
   @Override
   public void onAdDisplayed(LevelPlayAdInfo levelPlayAdInfo) {
      // 広告が画面に表示されました
   }

   @Override
   public void onAdRewarded(@NonNull LevelPlayReward reward, @NonNull LevelPlayAdInfo adInfo) {
      // Ad reward received 
   }
   @Override
   public void onAdDisplayFailed(LevelPlayAdError levelPlayAdError, LevelPlayAdInfo levelPlayAdInfo) {
      // Ad fails to be displayed
      // Optional
   }
   @Override
   public void onAdClicked(LevelPlayAdInfo levelPlayAdInfo) {
      // Ad was clicked
      // Optional
   }
   @Override
   public void onAdClosed(LevelPlayAdInfo levelPlayAdInfo) {
      // Ad was closed
      // Optional
   }
   @Override
   public void onAdInfoChanged(LevelPlayAdInfo levelPlayAdInfo) {
      // Called after the ad info is updated.別のリワード広告がロードされ、CPM/Rate が高い場合に利用可能
      // Optional
   }
   });
   ```

2. **Kotlin**

   ```kotlin
   // Rewarded ad オブジェクトを作成します 
   val mRewardedAd = LevelPlayRewardedAd("adUnitId")
   mRewardedAd.setListener(object :LevelPlayRewardedAdListener {
   override fun onAdLoaded(levelPlayAdInfo:LevelPlayAdInfo) {
      // 広告が正常にロードされました
   }
   override fun onAdLoadFailed(levelPlayAdError:LevelPlayAdError) {
      // 広告ロード失敗
   }
   override fun onAdDisplayed(levelPlayAdInfo:LevelPlayAdInfo) {
      // 広告が画面に表示されました
   }

   オーバーライド fun onAdRewarded(reward:LevelPlayReward, adInfo:LevelPlayAdInfo) {
      // Ad reward received 
   }
   override fun onAdDisplayFailed(levelPlayAdError:LevelPlayAdError、levelPlayAdInfo:LevelPlayAdInfo) {
      // Ad fails to be displayed
      // Optional
   }
   override fun onAdClicked(levelPlayAdInfo:LevelPlayAdInfo) {
      // Ad was clicked
      // Optional
   }
   override fun onAdClosed(levelPlayAdInfo:LevelPlayAdInfo) {
      // Ad was closed
      // Optional
   }
   override fun onAdInfoChanged(levelPlayAdInfo:LevelPlayAdInfo) {
      // Called after the ad info is updated.別のリワード広告がロードされ、CPM/Rate が高い場合に利用可能
      // Optional
   }
   })	 
   ```

### LevelPlay 広告情報##levelplay-ad-info

**LevelPlayAdInfo** パラメーターには、ロードされた広告に関する情報が含まれます。

## リワード広告の詳細を取得する##get-rewarded-ad-details

getReward API を使用して、LevelPlay ダッシュボードで設定した報酬データにアクセスします。他のメディエーション API とは異なり、これは初期化期化後に SDK にローカルに保存されたデータを返す独立した呼び出しです。これにより、広告を表示する前にユーザーに潜在的なゲーム内報酬を通知する動的なデータ駆動型 UI をビルドできるため、アプリケーション内で報酬値をハードコードする必要がなくなります。

### 前提条件##prerequisites

getReward API を実装する前に、プロジェクトが以下の技術要件を満たしていることを確認してください。

* **SDK 初期化**：initSDK を呼び出し、onInitializationSuccess コールバックが報酬データがキャッシュされていることを確認します。
* **広告オブジェクトインスタンス**：API を呼び出す前に、有効な広告単位 ID でリワード広告オブジェクトをインスタンス化します。
* **最低 SDK バージョン**:LevelPlay SDK バージョン 8.1.0 以上 (ネイティブまたは Unity パッケージ) を使用する。

### ベストプラクティス##best-practices

以下の推奨事項に従って、安定した予測可能なインテグレーションを行ってください。

* **初期化成功時**の呼び出し：getReward を呼び出し最適なタイミングは、初期化化成功リスナーのすぐ内側です。これにより、ユーザーが画面に入った瞬間に UI が準備されます。
* **空のステートをチェック**します。UI を更新する前に、必ず 0 を超える値を確認してください。これにより、初期化期化中にネットワークワークエラーが発生しても滑らかななユーザー体験が保証されます。
* **配置精度**:getReward("placementName") で使用される文字文字列が LevelPlay ダッシュボードで定義された名前と正確に一致していることを確認します。

### API 構造体##api-structure

getReward メソッドを使用すると、LevelPlay ダッシュボードから同期された報酬データにアクセスできます。このメソッドを使用して、ローカル SDK キャッシュに特定の配置値またはグローバル広告単位のデフォルトをクエリします。

#### getReward##getreward

```java
public LevelPlayReward getReward(String placementName)
```

特定の配置またはデフォルトの広告単位の報酬の名前と金額を取得します。その他に使用するパラメーターはありません。

| パラメーター        | 説明                                                                  |
| ------------- | ------------------------------------------------------------------- |
| placementName | LevelPlay ダッシュボードで定義されている配置の一意のの識別子。`null`を渡して、広告単位のデフォルトの報酬を取得します。 |

名前 (文字列) と金額 (int) を含む LevelPlayReward オブジェクトを返します。

### 初期設定##initial-setup

getReward API は、LevelPlay SDK のコア コンポーネントとして機能し、以下のロジックで動作して待ち時間なしでデータを利用できるようにします。

* **統合特徴**:報酬データはSDKの初期設定中に取得されるため、API呼び出しは瞬時に行われ、ネットワークリクエストを必要としません。
* **エディター設定**:アプリケーションを LevelPlay SDK と統合すると、API はすぐに使用できます。この機能をテストするために追加のアセットやプラグインは必要ありません。

### 報酬選択ロジックについて##understand-reward-selection-logic

API は、特定の階層に基づく LevelPlayReward オブジェクトを返します。このロジックを理解することで、特定の報酬が表示される理由のトラブルシューティングに役立ちます。

* **配置レベル**:呼び出しで有効な配置名が指定されている場合、SDKはダッシュボードでその配置に設定された特定の報酬を返します。
* **広告単位レベル**：配置名が null の場合、または見つからない場合は、SDK は広告単位に定義されたデフォルトの報酬にフォールバックします。
* **フォールバック状態**:初期化が完了する前に API が呼び出された場合は、空の文字列列名と金額 0 の報酬オブジェクトが返されます。

### UIの動的更新##update-your-ui-dynamically

getReward API を使用して、静的ボタンを意図的なアクション喚起に Transform します。例えば、ジェネリックのWatch Videoボタンの代わりに、Watch to Earned 50 Goldとディスプレイできます。

* **検証量**:UI コンポーネントを更新する前に、reward.amount が 0 を超えていることを常に確認してください。
* **イベント主導型更新**:初期化成功リスナー内で API を呼び出して、ユーザーが画面に入った瞬間に UI が正確であることを確認します。
* 大文字と小文字の**区別**:コード内の配置名の文字文字列が LevelPlay ダッシュボードと正確に一致していることを確認します。文字列が一致しないと、広告単位のフォールフォールバックがトリガーされます。

### 報酬データ例の取得##retrieve-reward-data-examples

以下の例は、reward API for Android の呼び出し方法を示しています。

1. **Kotlin**

   ```kotlin
   /** 
    * 広告に関連付けられた報酬を取得します。
    * このメソッドを使用して、広告単位または配置に設定された報酬を取得します。ザ 
    * 配置固有の報酬は、有効な配置名の場合は広告単位の報酬よりも優先されます。 
    * が表示されます。
    * @param 配置 報酬を取得する配置名、または広告単位の報酬を使用する`null`。
    * @return [LevelPlayReward] オブジェクト失敗した場合 (`name: ""` と `amount: 0`)、空の報酬を返します。
    */ 
   @JvmOverloads 
   fun getReward(placement:文字列? = null):LevelPlayReward { 
       val reward = mRewardedAd.getReward(placement)
       Log.d("LevelPlay", "Amount: ${reward.amount}, Name: ${reward.name}")
       リターン報酬
   }
   ```

2. **Java**

   ```java
   LevelPlayReward reward = mRewardedAd.getReward("bonus_level");
   if (reward.getAmount() > 0) {
       // 報酬ロジックの付与
   }
   ```

### getReward API 実装のトラブルシューティング##troubleshooting-getreward-api-implementation

* **Reward amount は 0 を返し**ます。これは通常、onInitializationSuccess コールバックの前に API が呼び出された場合に発生します。ゲーム内報酬のクエリを実行する前に、SDKの準備が完全にできていることを確認します。
* **間違った報酬タイプ**:複数のプレースメントがあるかどうかを確認します。配置名のスペルに誤りがある場合、SDKはデフォルトで特定の配置報酬ではなくプライマリ広告単位の報酬を使用します。

## リワード型広告のロード##load-rewarded-ad

リワード広告をロードするには、**loadAd** を使用します。

1. **Java**

   ```java
   mRewardedAd.loadAd();
   ```

2. **Kotlin**

   ```kotlin
   mRewardedAd.loadAd()	 
   ```

## リワード広告の表示##show-rewarded-ad

**LevelPlayRewardedAdListener** API を使用し**て onAdLoaded** コールバックを受信した後にリワード広告を表示します。

* **アクティビティ**の共有に必要です。 
* プレースメントを使用する場合は、後述のプレースメントのセクションで示すように、**showAd** API に配置名を渡します。
* ユーザーに広告が正常に表示されたら、ロードステップを繰り返して別の広告をロードできます。 

1. **Java**

   ```java
   public void showRewardedAd() {
   // 広告の準備ができていることを確認します
   if (mRewardedAd.isAdReady()) {
      // 広告を表示 
      mRewardedAd.showAd(this);
   }
   }	
   ```

2. **Kotlin**

   ```kotlin
   fun showRewardedAd() {
   // 広告の準備ができていることを確認します
   if (mRewardedAd.isAdReady()) {
      // 広告を表示
      mRewardedAd.showAd(this)
   }
   }	 
   ```

### 広告の準備ができているか確認##check-ad-is-ready

表示の失敗を避け、広告が正しく表示されるようにするために、**showAd** API を呼び出す前に以下の API を使用することをお勧めします。

**isAdReady** – 広告のロードが成功し、広告単位が上限に達していない場合は true、それ以外の場合は false を返します。

**isPlacementCapped** – 有効な配置に上限がある場合に true を返します。配置が有効でないか、上限がない場合、この API は false を返します。

1. **Java**

   ```java
   // 広告の準備ができていることと、配置に上限がないことを確認します。 
   if (mRewardedAd.isAdReady() &amp;&amp; !LevelPlayRewardedAd.isPlacementCapped(placementName)) {
   mRewardedAd.showAd(this, placementName);
   }	
   ```

2. **Kotlin**

   ```kotlin
   // 広告の準備ができていることと、配置に上限がないことを確認します。
   if (mRewardedAd.isAdReady() &amp;&amp; !LevelPlayRewardedAd.isPlacementCapped(placementName)) {
   mRewardedAd.showAd(this, placementName)
   }
   ```

### Placements##placements

LevelPlayダッシュボードでは、Rewardedの[プレースメント](/grow/levelplay/platform/settings/placements.md) ペーシングと上限設定をサポートしています。 

リワード広告にプレースメントが設定されている場合は、 **showAd** メソッドを呼び出して特定の配置の広告を配信します。

1. **Java**

   ```java
   public void showRewardedAdWithPlacement() {
      // 広告の準備ができていることと、配置に上限がないことを確認します。 
      if (mRewardedAd.isAdReady() &amp;&amp; !LevelPlayRewardedAd.isPlacementCapped(placementName)) {
      // 配置で広告を表示 
      mRewardedAd.showAd(this, placementName);
   }
   }
   ```

2. **Kotlin**

   ```kotlin
   fun showRewardedAdWithPlacement(placementName:文字列) {
      // 広告の準備ができていることと、配置に上限がないことを確認します。
      if (mRewardedAd.isAdReady() &amp;&amp; !LevelPlayRewardedAd.isPlacementCapped(placementName)) {
      // 配置で広告を表示
      mRewardedAd.showAd(this, placementName)
   }
   }
   ```

### Dynamic UserId##dynamic-userid

動的ユーザー ID は、AdRewarded トランザクションを検証するために使用されるパラメーターで、セッションを通じて変更できます。このパラメーターは、[サーバー間](/grow/levelplay/platform/settings/server-to-server-callback.md)の広告リワード型コールバックを通じて受け取ります。showAd を呼び出す前に設定する必要があります。

* 文字列 値は 1 \~ 64 文字の英数字でなければなりません。
* コールバックURLで報酬の詳細とともに`dynamicUserId`パラメーターを受け取ります。

1. **Java**

   ```java
   LevelPlay.setDynamicUserId("userId");
   ```

2. **Kotlin**

   ```kotlin
   LevelPlay.setDynamicUserId("userId")
   ```

## ユーザーの報酬##reward-the-user

LevelPlay SDK は、ユーザーがビデオを正常に視聴するたびに **onAdRewarded** を起動します。

**onAdRewarded** と **onAdClosed** は非同期です。**onAdClosed** 後に **onAdRewarded** が起動された場合でもゲーム内報酬を付与するようにリスナーを設定してください。

1. **Java**

   ```java
   @Override
   public void onAdRewarded(@NonNull LevelPlayReward reward, @NonNull LevelPlayAdInfo adInfo) {
     // ユーザーに報酬を付与するロジックを実装します
     String name = reward.getName();
     int amount = reward.getAmount();
   }
   ```

2. **Kotlin**

   ```kotlin
   override fun onAdRewarded(reward: LevelPlayReward, adInfo: LevelPlayAdInfo) {
     // ユーザーに報酬を付与するロジックを実装します
     val name: String = reward.name
     val amount: Int = reward.amount
   }
   ```

## リワード広告の完全な実装例##full-implementation-example-of-rewarded-ads

1. **Java**

   ```java
   public class RewardedAdActivity extends Activity implements LevelPlayRewardedAdListener {
   private LevelPlayRewardedAd mRewardedAd
   void createRewardedAd() {
      mRewardedAd = new LevelPlayRewardedAd("adUnitId");
      mRewardedAd.setListener(this);
   }
   void loadRewardedAd() {
      // 広告のロードまたはリロード
      mRewardedAd.loadAd();
   }
   void showRewardedAd() {
      if(mRewardedAd.isAdReady()) {
            mRewardedAd.showAd(this);
      }
   }
   void showRewardedAd(@NonNull String placementName) {
      // 広告の準備ができていることと、配置に上限がないことを確認します。 
      if(mRewardedAd.isAdReady() &amp;&amp; !LevelPlayRewardedAd.isPlacementCapped(placementName)) {
            mRewardedAd.showAd(this, placementName);
      }
   }
   // LevelPlayRewardedAdListener methods
   @Override
   public void onAdLoaded(@NonNull LevelPlayAdInfo adInfo) {}
   @Override
   public void onAdLoadFailed(@NonNull LevelPlayAdError error) {}
   @Override
   public void onAdDisplayed(@NonNull LevelPlayAdInfo adInfo) {}
   @Override
   public void onAdClosed(@NonNull LevelPlayAdInfo adInfo) {}
   @Override
   public void onAdClicked(@NonNull LevelPlayAdInfo adInfo) {}
   @Override
   public void onAdDisplayFailed(@NonNull LevelPlayAdError error, @NonNull LevelPlayAdInfo adInfo) {}
   @Override
   public void onAdInfoChanged(@NonNull LevelPlayAdInfo adInfo) {}
   @Override
   public void onAdRewarded(@NonNull LevelPlayReward reward, @NonNull LevelPlayAdInfo adInfo) {}
   }
   ```

2. **Kotlin**

   ```kotlin
   クラス RewardedAdActivity ：Activity(), LevelPlayRewardedAdListener {
   private lateinit var mRewardedAd:LevelPlayRewardedAd
   fun createRewardedAd() {
      mRewardedAd = LevelPlayRewardedAd("adUnitId")
      mRewardedAd.setListener(this)
   }
   fun loadRewardedAd() {
      mRewardedAd.loadAd()
   }
   fun showRewardedAd() {
      if (mRewardedAd.isAdReady()) {
          mRewardedAd.showAd(this)
      }
   }
   fun showRewardedAd(placementName:文字列) {
      // 広告の準備ができていることと、配置に上限がないことを確認します。 
      if (mRewardedAd.isAdReady() &amp;&amp; !LevelPlayRewardedAd.isPlacementCapped(placementName)) {
          mRewardedAd.showAd(this, placementName)
      }
   }
   // LevelPlayRewardedAdListener methods
   override fun onAdLoaded(adInfo:LevelPlayAdInfo) {}
   override fun onAdLoadFailed(error:LevelPlayAdError) {}
   オーバーライド fun onAdInfoChanged(adInfo:LevelPlayAdInfo) {}
   override fun onAdDisplayed(adInfo:LevelPlayAdInfo) {}
   オーバーライド fun onAdDisplayFailed(エラー:LevelPlayAdError、adInfo：LevelPlayAdInfo) {}
   override fun onAdClicked(adInfo:LevelPlayAdInfo) {}
   override fun onAdClosed(adInfo:LevelPlayAdInfo) {}
   オーバーライド fun onAdRewarded(reward:LevelPlayReward, adInfo:LevelPlayAdInfo) {}
   }
   ```

## LevelPlay Mediation デモアプリケーション##levelplay-mediation-demo-app

インテグレーション Demo (インテグレーションデモ) アプリケーションは、リワード広告単位 API をアプリケーションに統合する方法を示します。

[Androidデモアプリケーションのダウンロード](https://github.com/ironsource-mobile/Mediation-Demo-Apps)

[インテグレーションテストスイート](/grow/levelplay/sdk/unity/integration-test-suite.md)とのインテグレーションを確認します。

## 次のステップ##next-steps

インテグレーション ガイドに従って、追加のリワード型広告ネットワークを統合したり、追加の広告フォーマットを設定したりできます。

* [メディエーションネットワークの追加](/grow/levelplay/sdk/android/mediation-networks.md)
* [インタースティシャル広告](/grow/levelplay/sdk/android/interstitial-integration.md)
* [バナー広告](/grow/levelplay/sdk/android/banner-integration.md)
* [ネイティブ広告](/grow/levelplay/sdk/android/native-ads-integration.md)
