AppLovinSDKを android java(ネイティブ)で導入する方法

# AppLovinSDKを android java(ネイティブ)で導入する方法

Unityやcocos2dxとは違い、androidのライフサイクルが絡んでくるので、
個人的にはネイティブで導入する方が難しかった。
複数の動画SDKを入れる場合は、メディエーションで入れるととコールバックがまとめられ楽できるかもw。汗

getActivityやgetApplicationContext等をシングルトンとして引き回したい場合の参考にも。ｗ汗


## インスタースティシャル版の導入


Android Studio等でツール・アプリを作る際は、、
初期化後、getApplicationContext()や、getAcitivy()の情報を引き回す必要があり、
それらに注意する。

WeakReferenceというものをキャッシュされたののを引き回す事ができるので、
予め、getApplicationContext()とgetActivity()をできるようにしておくと便利


例： 

```java:

// MainActivityでセットした参照をキャッシュを使って、applovin再生
final WeakReference<MainActivity> weakRef = new WeakReference<MainActivity>(MainActivity.getInstance());

```

### getApplicationContext()を引きまわす準備


#### シングルトンの準備

```java:MyApplication.java

public class MyApplication extends Application {
 	
 	//シングルトンの代わりとして利用（アプリが終了するまで存在する
 	private static MyApplication sInstance; 

    // 取得用
    public static MyApplication getInstance() {
        return sInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();


        sInstance = this;


```

#### 呼び出し側

```java

MyApplication.getInstance();

```

これで、AppCompatAcitivy等、Acitivyも持っている場合はこれだけでOK。


### getAcitivy()を引き回す


Fragment等で、Acitivyが呼び出したい画面でActivityが取得できない場合は、
FragmentAcitivyを継承しているところで、Singleton化してあげる必要があります。


```java:MainAcitivy.java

public class MainActivity extends FragmentActivity {

	private static MainActivity mainActivityInstance; //シングルトンの代わりとして利用（アプリが終了するまで存在する

    // 取得用
    public static MainActivity getInstance() {
        return mainActivityInstance;
    }

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

        mainActivityInstance = this;


```


#### 呼び出し側

```java:

MainActivity.getInstance()


```





#### AppLovin動画再生

```java:HogeFrament.java


 	private AppLovinIncentivizedInterstitial incentivizedInterstitial;


 //〜〜省略〜〜


	final WeakReference<MainActivity> weakRef = new WeakReference<MainActivity>(MainActivity.getInstance()); // ★先程のMainActivityで用意したインスタンスを使用




 //〜〜省略〜〜


 	// Applovin リワード型の読み込み準備
	incentivizedInterstitial = AppLovinIncentivizedInterstitial.create(MyApplication.getInstance()); //先程用意した、MyApplicationのインスタンスを使って、applovinを初期化
	incentivizedInterstitial.preload(new AppLovinAdLoadListener() {
	    @Override
	    public void adReceived(AppLovinAd appLovinAd) {
			// showButton.setEnabled(true); //動画視聴ボタンを有効化等
	    }


	    @Override
	    public void failedToReceiveAd(int errorCode) {
	        log("Rewarded video failed to load with error code " + errorCode);
	    }
	});

//〜〜省略〜〜

	// Applivn リワード型再生可能かチェック
	if (incentivizedInterstitial.isAdReadyToDisplay()) {

	    // Applovin コールバック
	    // Reward Listener
	    AppLovinAdRewardListener adRewardListener = new AppLovinAdRewardListener() {
	        @Override
	        public void userRewardVerified(AppLovinAd appLovinAd, Map map) {
	            // AppLovin servers validated the reward. Refresh user balance from your server.  We will also pass the number of coins
	            // awarded and the name of the currency.  However, ideally, you should verify this with your server before granting it.

	            // i.e. - "Coins", "Gold", whatever you set in the dashboard.
	            String currencyName = (String) map.get("currency");

	            // For example, "5" or "5.00" if you've specified an amount in the UI.
	            String amountGivenString = (String) map.get("amount");

	            log("Rewarded " + amountGivenString + " " + currencyName);
	            log("");
	            // By default we'll show a alert informing your user of the currency & amount earned.
	            // If you don't want this, you can turn it off in the Manage Apps UI.

	            Logger.d("Applovin_userRewardVerified");


	            // 動画視聴完了ポップアップダイアログ表示等...
	            DialogFragment hintDialogFragment = new HintDialogFragment();

	            Bundle args = new Bundle();
	            args.putInt("stamp_id", stampId); //引数
	            hintDialogFragment.setArguments(args);
	            hintDialogFragment.show(MainActivity.getInstance().getFragmentManager(), "dialog"); // ★先程のMainActivityで用意したインスタンスを使って、dialog等のview表示に！
	        }


	        @Override
	        public void userOverQuota(AppLovinAd appLovinAd, Map map) {
	            // Your user has already earned the max amount you allowed for the day at this point, so
	            // don't give them any more money. By default we'll show them a alert explaining this,
	            // though you can change that from the AppLovin dashboard.

	            Logger.d("Applovin_userOverQuota");
	        }

	        @Override
	        public void userRewardRejected(AppLovinAd appLovinAd, Map map) {
	            // Your user couldn't be granted a reward for this view. This could happen if you've blacklisted
	            // them, for example. Don't grant them any currency. By default we'll show them an alert explaining this,
	            // though you can change that from the AppLovin dashboard.

	            Logger.d("Applovin_userRewardRejected");
	        }

	        @Override
	        public void validationRequestFailed(AppLovinAd appLovinAd, int responseCode) {

	            Logger.d("Applovin_validationRequestFailed" + responseCode);
	            if (responseCode == AppLovinErrorCodes.INCENTIVIZED_USER_CLOSED_VIDEO) {
	                // Your user exited the video prematurely. It's up to you if you'd still like to grant
	                // a reward in this case. Most developers choose not to. Note that this case can occur
	                // after a reward was initially granted (since reward validation happens as soon as a
	                // video is launched).
	            } else if (responseCode == AppLovinErrorCodes.INCENTIVIZED_SERVER_TIMEOUT || responseCode == AppLovinErrorCodes.INCENTIVIZED_UNKNOWN_SERVER_ERROR) {
	                // Some server issue happened here. Don't grant a reward. By default we'll show the user
	                // a alert telling them to try again later, but you can change this in the
	                // AppLovin dashboard.
	            } else if (responseCode == AppLovinErrorCodes.INCENTIVIZED_NO_AD_PRELOADED) {
	                // Indicates that the developer called for a rewarded video before one was available.
	                // Note: This code is only possible when working with rewarded videos.
	            }
	        }

	        @Override
	        public void userDeclinedToViewAd(AppLovinAd appLovinAd) {
	            // This method will be invoked if the user selected "no" when asked if they want to view an ad.
	            // If you've disabled the pre-video prompt in the "Manage Apps" UI on our website, then this method won't be called.

	            Logger.d("Applovin_userDeclinedToViewAd");
	        }
	    };

	    // Video Playback Listener
	    AppLovinAdVideoPlaybackListener adVideoPlaybackListener = new AppLovinAdVideoPlaybackListener() {
	        @Override
	        public void videoPlaybackBegan(AppLovinAd appLovinAd) {
	            log("Video Started");
	            Logger.d("Applovin_videoPlaybackBegan");
	        }

	        @Override
	        public void videoPlaybackEnded(AppLovinAd appLovinAd, double v, boolean b) {
	            log("Video Ended");

	            Logger.d("Applovin_Video_endied");
	        }
	    };

	    // Ad Dispaly Listener
	    AppLovinAdDisplayListener adDisplayListener = new AppLovinAdDisplayListener() {
	        @Override
	        public void adDisplayed(AppLovinAd appLovinAd) {
	            log("Ad Displayed");
	        }

	        @Override
	        public void adHidden(AppLovinAd appLovinAd) {
	            log("Ad Dismissed");
	        }
	    };

	    // Ad Click Listener
	    AppLovinAdClickListener adClickListener = new AppLovinAdClickListener() {
	        @Override
	        public void adClicked(AppLovinAd appLovinAd) {
	            log("Ad Click");
	        }
	    };

	    // 動画表示
	    incentivizedInterstitial.show(weakRef.get(), adRewardListener, adVideoPlaybackListener, adDisplayListener, adClickListener);

	    
	    getDialog().dismiss();


	    log("Interstitial Displayed");
	} else {
	    // Ideally, the SDK preloads ads when you initialize it in your launch activity
	    // you can manually load an ad as demonstrated in InterstitialManualLoadingActivity
	    log("Interstitial not ready for display.\nPlease check SDK key or internet connection.");
	}

```                        

初期化は起動時にやっておくと、バッファリング時間の省略になると思うので、起動時にやっておいた方がいいと思います。