AppLovin MAX MREC Ads Integration Guide (Android)

AppLovin MAX MREC ads

This is a part of the AppLovin SDK integration guide. To show an MREC (Medium Rectangle) ad, we need to create an ad unit. Login to your AppLovin dashboard, go to MAX > Ad Units section on the left panel. Next, click on the “Create Ad Unit” button.

MAX Create Ad Unit

On the next page, type a name for the ad unit. Select the Android platform and type your app name. Your app will come up in the list. Next, select the MREC ad type. We will add the mediation networks later. Scroll down and click on the green color Save button.

Medium Rectangle Ad Unit

It creates an ad unit along with a unique id. Copy the id.

Now, let’s do the coding. We need to create a layout for the ad. There are two ways to do this.

  1. Using XML layout
  2. Using Java/Kotlin Code
  3. MREC Ad in Jetpack Compose

1. Using XML Layout:

Here is the XML code for the MREC ad.

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     tools:context=".MainActivity">
      
     <com.applovin.mediation.ads.MaxAdView xmlns:maxads="http://schemas.applovin.com/android/1.0"
          android:id="@+id/max_ad_view_medium_rect"
          android:layout_width="300dp"
          android:layout_height="250dp"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent"
          maxads:adFormat="MREC"
          maxads:adUnitId="YOUR_AD_UNIT_ID" />
      
</androidx.constraintlayout.widget.ConstraintLayout>

Replace YOUR_AD_UNIT_ID with the actual ad unit.

MainActivity.kt (Kotlin):

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdViewAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAdView
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkConfiguration

class MainActivity : AppCompatActivity(), MaxAdViewAdListener {

    private var maxAdViewMediumRect: MaxAdView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        maxAdViewMediumRect = findViewById(R.id.max_ad_view_medium_rect)
        initializeAdNetwork() // initialize ads only once during the app startup
        loadMediumRectAd()
    }

    private fun initializeAdNetwork() {
        AppLovinSdk.getInstance(getApplicationContext()).mediationProvider = "max"
        AppLovinSdk.getInstance(getApplicationContext()).initializeSdk { configuration: AppLovinSdkConfiguration ->
              
        }
    }

    private fun loadMediumRectAd() {
        maxAdViewMediumRect?.loadAd()
    }

    override fun onDestroy() {
        // Destroy the MaxAdView
        maxAdViewMediumRect?.stopAutoRefresh()
        maxAdViewMediumRect?.setListener(null)
        maxAdViewMediumRect?.removeAllViews()
        maxAdViewMediumRect?.destroy()
        maxAdViewMediumRect = null
        super.onDestroy()
    }

    // Following methods are Max Ad Listeners

    override fun onAdLoaded(ad: MaxAd?) {
    }

     override fun onAdDisplayed(ad: MaxAd?) {
        /* DO NOT USE - THIS IS RESERVED FOR FULLSCREEN ADS ONLY AND WILL BE REMOVED IN A FUTURE SDK RELEASE */
    }

    override fun onAdHidden(ad: MaxAd?) {
        /* DO NOT USE - THIS IS RESERVED FOR FULLSCREEN ADS ONLY AND WILL BE REMOVED IN A FUTURE SDK RELEASE */
    }

    override fun onAdClicked(ad: MaxAd?) {
    }

    override fun onAdLoadFailed(adUnitId: String?, error: MaxError?) {
    }

    override fun onAdDisplayFailed(ad: MaxAd?, error: MaxError?) {
    }

    override fun onAdExpanded(ad: MaxAd?) {
    }

    override fun onAdCollapsed(ad: MaxAd?) {
    }
}

MainActivity.java (Java):

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.applovin.mediation.MaxAd;
import com.applovin.mediation.MaxAdViewAdListener;
import com.applovin.mediation.MaxError;
import com.applovin.mediation.ads.MaxAdView;
import com.applovin.sdk.AppLovinSdk;
import com.applovin.sdk.AppLovinSdkConfiguration;

public class MainActivity extends AppCompatActivity implements MaxAdViewAdListener {

    private MaxAdView maxAdViewMediumRect;

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

        maxAdViewMediumRect = findViewById(R.id.max_ad_view_medium_rect);
        initializeAdNetwork(); // initialize ads only once during the app startup
        loadMediumRectAd();
    }

    private void initializeAdNetwork() {
        AppLovinSdk.getInstance(getApplicationContext()).setMediationProvider("max");
        AppLovinSdk.initializeSdk(getApplicationContext(), new AppLovinSdk.SdkInitializationListener() {
            @Override
            public void onSdkInitialized(final AppLovinSdkConfiguration configuration) {
            }
        });
    }

    private void loadMediumRectAd() {
        maxAdViewMediumRect.loadAd();
    }

    @Override
    protected void onDestroy() {
        // Destroy the MaxAdView
        maxAdViewMediumRect.stopAutoRefresh();
        maxAdViewMediumRect.setListener(null);
        maxAdViewMediumRect.removeAllViews();
        maxAdViewMediumRect.destroy();
        maxAdViewMediumRect = null;
        super.onDestroy();
    }

    @Override
    public void onAdExpanded(MaxAd ad) {
    }

    @Override
    public void onAdCollapsed(MaxAd ad) {
    }

    @Override
    public void onAdLoaded(MaxAd ad) {
    }

    @Override
    public void onAdDisplayed(MaxAd ad) {
    }

    @Override
    public void onAdHidden(MaxAd ad) {
    }

    @Override
    public void onAdClicked(MaxAd ad) {
    }

    @Override
    public void onAdLoadFailed(String adUnitId, MaxError error) {
    }

    @Override
    public void onAdDisplayFailed(MaxAd ad, MaxError error) {
    }
}

2. Using Java/Kotlin Code:

If you don’t want to use XML, you can use the following Kotlin or Java code.

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/root_view_main"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

</LinearLayout>

MainActivity.kt (Kotlin):

import android.os.Bundle
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdFormat
import com.applovin.mediation.MaxAdViewAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAdView
import com.applovin.sdk.AppLovinSdkUtils
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkConfiguration

class MainActivity : AppCompatActivity(), MaxAdViewAdListener {

    private var adView: MaxAdView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initializeAdNetwork() // initialize ads only once during the app startup
        createMRECAd()
        loadMRECAd()
    }

    private fun initializeAdNetwork() {
        AppLovinSdk.getInstance(getApplicationContext()).mediationProvider = "max"
        AppLovinSdk.getInstance(getApplicationContext()).initializeSdk { configuration: AppLovinSdkConfiguration ->
              
        }
    }

    private fun createMRECAd() {
        adView = MaxAdView("YOUR_AD_UNIT_ID", MaxAdFormat.MREC, this)

        adView!!.setListener(this)

        // MREC width and height are 300 and 250 respectively, on phones and tablets
        val widthPx = AppLovinSdkUtils.dpToPx(this, 300)
        val heightPx = AppLovinSdkUtils.dpToPx(this, 250)

        adView!!.layoutParams = FrameLayout.LayoutParams(widthPx, heightPx)

        // Set background or background color for MRECs to be fully functional
        adView!!.setBackgroundColor(ContextCompat.getColor(applicationContext, R.color.black))

        val rootView = findViewById<ViewGroup>(R.id.root_view_main)
        rootView.addView(adView)
    }

    private fun loadMRECAd() {
        adView?.loadAd()
    }

    override fun onDestroy() {
        // Destroy the MaxAdView
        adView?.stopAutoRefresh()
        adView?.setListener(null)
        adView?.removeAllViews()
        adView?.destroy()
        adView = null
        super.onDestroy()
    }

    // Following methods are Max Ad Listeners

    override fun onAdLoaded(ad: MaxAd?) {
    }

    override fun onAdDisplayed(ad: MaxAd?) {
        /* DO NOT USE - THIS IS RESERVED FOR FULLSCREEN ADS ONLY AND WILL BE REMOVED IN A FUTURE SDK RELEASE */
    }

    override fun onAdHidden(ad: MaxAd?) {
        /* DO NOT USE - THIS IS RESERVED FOR FULLSCREEN ADS ONLY AND WILL BE REMOVED IN A FUTURE SDK RELEASE */
    }

    override fun onAdClicked(ad: MaxAd?) {
    }

    override fun onAdLoadFailed(adUnitId: String?, error: MaxError?) {
    }

    override fun onAdDisplayFailed(ad: MaxAd?, error: MaxError?) {
    }

    override fun onAdExpanded(ad: MaxAd?) {
    }

    override fun onAdCollapsed(ad: MaxAd?) {
    }
}

MainActivity.java (Java):

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.applovin.mediation.MaxAd;
import com.applovin.mediation.MaxAdFormat;
import com.applovin.mediation.MaxAdViewAdListener;
import com.applovin.mediation.MaxError;
import com.applovin.mediation.ads.MaxAdView;
import com.applovin.sdk.AppLovinSdk;
import com.applovin.sdk.AppLovinSdkConfiguration;
import com.applovin.sdk.AppLovinSdkUtils;

public class MainActivity extends AppCompatActivity implements MaxAdViewAdListener {

    private MaxAdView adView;

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

        initializeAdNetwork(); // initialize ads only once during the app startup
        createMRECAd();
        loadMRECAd();
    }

    private void initializeAdNetwork() {
        AppLovinSdk.getInstance(getApplicationContext()).setMediationProvider("max");
        AppLovinSdk.initializeSdk(getApplicationContext(), new AppLovinSdk.SdkInitializationListener() {
            @Override
            public void onSdkInitialized(final AppLovinSdkConfiguration configuration) {
            }
        });
    }

    private void createMRECAd() {
        adView = new MaxAdView("YOUR_AD_UNIT_ID", MaxAdFormat.MREC, this);

        adView.setListener(this);

        // MREC width and height are 300 and 250 respectively, on phones and tablets
        int widthPx = AppLovinSdkUtils.dpToPx(this, 300);
        int heightPx = AppLovinSdkUtils.dpToPx(this, 250);

        adView.setLayoutParams(new FrameLayout.LayoutParams(widthPx, heightPx));

        // Set background or background color for MRECs to be fully functional
        adView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.black));

        ViewGroup rootView = findViewById(R.id.root_view_main);
        rootView.addView(adView);
    }

    private void loadMRECAd() {
        adView.loadAd();
    }

    @Override
    protected void onDestroy() {
        // Destroy the MaxAdView
        adView.stopAutoRefresh();
        adView.setListener(null);
        adView.removeAllViews();
        adView.destroy();
        adView = null;
        super.onDestroy();
    }

    @Override
    public void onAdExpanded(MaxAd ad) {
    }

    @Override
    public void onAdCollapsed(MaxAd ad) {
    }

    @Override
    public void onAdLoaded(MaxAd ad) {
    }

    @Override
    public void onAdDisplayed(MaxAd ad) {
    }

    @Override
    public void onAdHidden(MaxAd ad) {
    }

    @Override
    public void onAdClicked(MaxAd ad) {
    }

    @Override
    public void onAdLoadFailed(String adUnitId, MaxError error) {
    }

    @Override
    public void onAdDisplayFailed(MaxAd ad, MaxError error) {
    }
}

3. MREC Ad in Jetpack Compose:

There is no dedicated composable to display MREC ads in Jetpack Compose. But, Jetpack Compose offers AndroidView. It helps us to display classic Android Views. We can use it for our MREC ad.

MainActivity.kt:

import android.os.Bundle
import android.view.View
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.applovin.mediation.MaxAdFormat
import com.applovin.mediation.ads.MaxAdView
import com.applovin.sdk.AppLovinPrivacySettings
import com.applovin.sdk.AppLovinSdk

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        initializeAdNetworks()

        setContent {
            YourProjectNameTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    Column {
                        // MAX MREC ad
                        AndroidView(
                            modifier = Modifier
                                .size(width = 300.dp, height = 250.dp),
                            factory = { context ->
                                MaxAdView("YOUR_AD_UNIT_ID", MaxAdFormat.MREC, context).apply {
                                    visibility = View.VISIBLE
                                    loadAd()
                                    startAutoRefresh()
                                }
                            }
                        )
                    }
                }
            }
        }
    }

    private fun initializeAdNetworks() {

        AppLovinPrivacySettings.setHasUserConsent(false, applicationContext)
        AppLovinPrivacySettings.setIsAgeRestrictedUser(false, applicationContext)
        AppLovinPrivacySettings.setDoNotSell(true, applicationContext)

        //AdSettings.setDataProcessingOptions(arrayOf<String>())

        AppLovinSdk.getInstance(this).mediationProvider = "max"
        AppLovinSdk.getInstance(this).initializeSdk {
            // AppLovin SDK is initialized, start loading ads
        }
    }
}

Don’t forget to replace YOUR_AD_UNIT_ID with your actual id.

Now, run the app. You will see a test ad. If nothing shows up, check the following things:

  • AppLovin SDK key in the manifest file.
  • See the network you selected in the Test Device section. You should add the network’s dependency in the build.gradle file.
  • Check if the YOUR_AD_UNIT_ID is correct and belongs to the app you are testing.

If you still have problem, look at the onAdLoadFailed() and onAdDisplayFailed() methods. You have access to the error object. Log the error.getMessage() to see the problem.

This is all about AppLovin MREC ads integration in Android. If you have any doubts, comment below.

Leave a Comment