Ajouter une bannière AdMob et des annonces natives intégrées à une application Flutter

Dans cet atelier de programmation, vous allez ajouter une bannière AdMob et des annonces natives AdMob intégrées à une application Flutter.

Objectifs de l'atelier

Cet atelier de programmation va vous aider à mettre en œuvre une bannière et des annonces AdMob intégrées dans une application Flutter à l'aide du plug-in Google Mobile Ads pour Flutter.

Si vous rencontrez des problèmes (bugs de code, erreurs grammaticales, formulation peu claire, etc.) au cours de cet atelier, signalez-les à l'aide du lien Signaler une erreur situé dans l'angle inférieur gauche de l'atelier de programmation.

Points abordés

  • Configurer le plug-in Google Mobile Ads pour Flutter
  • Mettre en œuvre une bannière intégrée et des annonces avec récompense dans une application Flutter

Prérequis

  • Android Studio 4.1 ou version ultérieure
  • Xcode 12 ou version ultérieure (pour le développement sur iOS)

Comment évalueriez-vous votre niveau d'expérience avec AdMob ?

Débutant Intermédiaire Expert

Comment évalueriez-vous votre niveau d'expérience avec Flutter ?

Débutant Intermédiaire Expert

Configurer l'environnement de développement Flutter

  1. Installez le SDK Flutter sur votre ordinateur.
  2. Ouvrez Android Studio, puis installez l'extension Flutter pour Android Studio.

Télécharger le code

Télécharger le code source Afficher le dépôt sur GitHub

Téléchargez le fichier ZIP, puis décompressez son contenu. Vous disposerez d'un dossier intitulé admob-inline-ads-in-flutter-main.

Vous pouvez également cloner le dépôt GitHub à partir de la ligne de commande :

$ git clone https://github.com/googlecodelabs/admob-inline-ads-in-flutter

Le dépôt contient trois dossiers :

  • android_studio_folder.png starter : le code de démarrage sur lequel s'appuie cet atelier de programmation.
  • android_studio_folder.png complete : le code final de cet atelier de programmation (Java et Objective-C pour le code natif).
  • android_studio_folder.png complete_kotlin_swift : le code final de cet atelier de programmation (Kotlin et Swift pour le code natif).

Étant donné que Flutter est un SDK multiplate-forme, vous devez ajouter une application et des blocs d'annonces pour Android et iOS dans AdMob.

Configurer pour Android

Pour configurer pour Android, vous devez ajouter une application Android et créer des blocs d'annonces.

Ajouter une application Android

  1. Dans la console AdMob, cliquez sur AJOUTER UNE APPLICATION dans le menu Applications.
  2. Lorsque le message Avez-vous publié votre application sur Google Play ou sur l'App Store ? s'affiche, cliquez sur NON.
  3. Saisissez AdMob inline ads dans le champ du nom de l'application, puis sélectionnez la plate-forme Android.

e4d968797610c8c0.png

  1. Il n'est pas nécessaire d'activer les métriques utilisateur pour effectuer cet atelier de programmation. Toutefois, nous vous recommandons de le faire, car cela vous permet de comprendre plus en détail le comportement des utilisateurs. Cliquez sur ADD (Ajouter) pour terminer le processus.

5204925f5c652b41.png

Créer des blocs d'annonces

Pour ajouter des blocs d'annonces :

  1. Sélectionnez l'application Annonces AdMob intégrées dans le menu Applications de la console AdMob.
  2. Cliquez sur le menu Blocs d'annonces.

Bannière

  1. Cliquez sur AJOUTER UN BLOC D'ANNONCES.
  2. Sélectionnez le format Bannière.
  3. Saisissez android-inline-banner dans le champ Nom du bloc d'annonces.
  4. Cliquez sur CRÉER UN BLOC D'ANNONCES pour terminer le processus.

Natif

  1. Cliquez sur AJOUTER UN BLOC D'ANNONCES.
  2. Sélectionnez le format Natif avancé.
  3. Saisissez android-inline-native dans le champ Nom du bloc d'annonces.
  4. Cliquez sur CRÉER UN BLOC D'ANNONCES pour terminer le processus.

Il faut en général compter quelques heures pour qu'un nouveau bloc d'annonces puisse diffuser des annonces.

Si vous voulez tester le comportement de l'annonce immédiatement, utilisez l'ID de l'application de test et les ID de blocs d'annonces indiqués respectivement dans les tableaux "ID de l'application Android/ID du bloc d'annonces" et "ID de l'application iOS/ID du bloc d'annonces".

Configurer pour iOS

Pour configurer pour iOS, vous devez ajouter une application iOS et créer des blocs d'annonces.

Ajouter une application iOS

  1. Dans la console AdMob, cliquez sur AJOUTER UNE APPLICATION dans le menu Applications.
  2. Lorsque le message Avez-vous publié votre application sur Google Play ou sur l'App Store ? s'affiche, cliquez sur NON.
  3. Saisissez AdMob inline ads dans le champ du nom de l'application, puis sélectionnez la plate-forme iOS.

e00fc8ac930a251b.png

  1. Il n'est pas nécessaire d'activer les métriques utilisateur pour effectuer cet atelier de programmation. Toutefois, nous vous recommandons de le faire, car cela vous permet de comprendre plus en détail le comportement des utilisateurs. Cliquez sur ADD (Ajouter) pour terminer le processus.

5204925f5c652b41.png

Créer des blocs d'annonces

Pour ajouter des blocs d'annonces :

  1. Sélectionnez l'application Annonces AdMob intégrées dans le menu Applications de la console AdMob.
  2. Cliquez sur le menu Blocs d'annonces.

Bannière

  1. Cliquez sur AJOUTER UN BLOC D'ANNONCES.
  2. Sélectionnez le format Bannière.
  3. Saisissez ios-inline-banner dans le champ Nom du bloc d'annonces.
  4. Cliquez sur CRÉER UN BLOC D'ANNONCES pour terminer le processus.

Natif

  1. Cliquez sur AJOUTER UN BLOC D'ANNONCES.
  2. Sélectionnez le format Natif avancé.
  3. Saisissez ios-inline-native dans le champ Nom du bloc d'annonces.
  4. Cliquez sur CRÉER UN BLOC D'ANNONCES pour terminer le processus.

Il faut en général compter quelques heures pour qu'un nouveau bloc d'annonces puisse diffuser des annonces.

Si vous voulez tester le comportement de l'annonce immédiatement, utilisez l'ID de l'application de test et les ID de blocs d'annonces indiqués dans le tableau suivant.

(Facultatif) Utiliser l'application et les blocs d'annonces AdMob de test

Si vous souhaitez suivre l'atelier de programmation au lieu de créer vous-même une application et des blocs d'annonces, vous pouvez utiliser l'ID de l'application AdMob de test et les ID de blocs d'annonces indiqués dans les tableaux suivants.

ID de l'application Android/ID du bloc d'annonces

Élément

ID de l'application/ID du bloc d'annonces

ID de l'application AdMob

ca-app-pub-3940256099942544~3347511713

Bannière

ca-app-pub-3940256099942544/6300978111

Natif

ca-app-pub-3940256099942544/2247696110

ID d l'application iOS/ID du bloc d'annonces

Élément

ID de l'application/ID du bloc d'annonces

ID de l'application AdMob

ca-app-pub-3940256099942544~1458002511

Bannière

ca-app-pub-3940256099942544/2934735716

Natif

ca-app-pub-3940256099942544/3986624511

Pour en savoir plus sur les annonces tests, consultez la documentation destinée aux développeurs pour les annonces tests Android et les annonces tests iOS.

Flutter utilise des plug-ins pour fournir un accès à un large éventail de services spécifiques à une plate-forme. Les plug-ins vous permettent d'accéder aux services et aux API sur chaque plate-forme.

Le plug-in google_mobile_ads permet de charger et d'afficher des bannières, des interstitiels, des annonces avec récompense et des annonces natives à l'aide de l'API AdMob.

Étant donné que Flutter est un SDK multiplate-forme, le plug-in google_mobile_ads peut être utilisé pour iOS et Android. Si vous ajoutez le plug-in à votre application Flutter, il est utilisé à la fois par les versions Android et iOS de l'application d'annonces AdMob intégrées.

Ajouter le plug-in Google Mobile Ads en tant que dépendance

Pour accéder aux API AdMob à partir du projet annonces AdMob intégrées, ajoutez google_mobile_ads en tant que dépendance au fichier pubspec.yaml situé à la racine du projet.

pubspec.yaml.

...
environment:
  # TODO: Update the minimum sdk version to 2.12.0 to support null safety.
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  google_fonts: ^0.3.9

  # TODO: Add google_mobile_ads as a dependency
  google_mobile_ads: ^0.12.0

...

Cliquez sur Pub get pour installer le plug-in dans le projet Annonces intégrées AdMob.

39e66c2a3b7f078b.png

Mettre à jour le fichier AndroidManifest.xml (Android)

  1. Ouvrez le fichier android/app/src/main/AndroidManifest.xml dans Android Studio.
  2. Ajoutez l'ID de votre application AdMob en ajoutant une balise <meta-data> nommée com.google.android.gms.ads.APPLICATION_ID. Par exemple, si l'ID de votre application AdMob est ca-app-pub-3940256099942544~3347511713, ajoutez les lignes suivantes au fichier AndroidManifest.xml.

AndroidManifest.xml

<manifest>
    ...
    <application>
       ...
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-3940256099942544~3347511713"/>
    </application>

</manifest>

Mettre à jour le fichier Info.plist (iOS)

  1. Ouvrez le fichier ios/Runner/Info.plist dans Android Studio.
  2. Ajoutez une clé GADApplicationIdentifier avec la valeur de chaîne de l'ID de votre application AdMob. Par exemple, si l'ID de votre application AdMob est ca-app-pub-3940256099942544~1458002511, ajoutez les lignes suivantes au fichier Info.plist.

ios/Runner/Info.plist

...
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-3940256099942544~1458002511</string>
...

Créez un fichier nommé ad_helper.dart dans le répertoire lib. Ensuite, mettez en œuvre la classe AdHelper, qui fournit un ID d'application AdMob et des ID de blocs d'annonces pour Android et iOS.

Veillez à remplacer l'ID de l'application AdMob (ca-app-pub-xxxxxx~yyyyy) et l'ID du bloc d'annonces (ca-app-pub-xxxxxxx/yyyyyyyy) par les ID que vous avez créés à l'étape précédente.

ad_helper.dart

import 'dart:io';

class AdHelper {

  static String get bannerAdUnitId {
    if (Platform.isAndroid) {
      return "<YOUR_ANDROID_BANNER_AD_UNIT_ID";
    } else if (Platform.isIOS) {
      return "<YOUR_IOS_BANNER_AD_UNIT_ID>";
    } else {
      throw new UnsupportedError("Unsupported platform");
    }
  }

  static String get nativeAdUnitId {
    if (Platform.isAndroid) {
      return "<YOUR_ANDROID_NATIVE_AD_UNIT_ID>";
    } else if (Platform.isIOS) {
      return "<YOUR_IOS_NATIVE_AD_UNIT_ID>";
    } else {
      throw new UnsupportedError("Unsupported platform");
    }
  }
}

Servez-vous de l'extrait de code suivant si vous souhaitez utiliser l'ID de l'application AdMob et les ID de blocs d'annonces de test.

ad_helper.dart

import 'dart:io';

class AdHelper {

  static String get bannerAdUnitId {
    if (Platform.isAndroid) {
      return 'ca-app-pub-3940256099942544/6300978111';
    } else if (Platform.isIOS) {
      return 'ca-app-pub-3940256099942544/2934735716';
    }
    throw new UnsupportedError("Unsupported platform");
  }

  static String get nativeAdUnitId {
    if (Platform.isAndroid) {
      return 'ca-app-pub-3940256099942544/2247696110';
    } else if (Platform.isIOS) {
      return 'ca-app-pub-3940256099942544/3986624511';
    }
    throw new UnsupportedError("Unsupported platform");
  }
}

Avant de charger les annonces, vous devez initialiser le SDK Google Mobile Ads. Ouvrez le fichier lib/home_page.dart et modifiez _initGoogleMobileAds() pour initialiser le SDK avant le chargement de la page d'accueil.

Notez que vous devez modifier le type renvoyé par la méthode _initGoogleMobileAds() en remplaçant Future<dynamic> par Future<InitializationStatus> pour obtenir le résultat d'initialisation du SDK une fois l'opération terminée.

home_page.dart

// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';

import 'package:flutter/material.dart';

...

class HomePage extends StatelessWidget {

  ...

  Future<InitializationStatus> _initGoogleMobileAds() {
    // TODO: Initialize Google Mobile Ads SDK
    return MobileAds.instance.initialize();
  }
}

Dans cette section, vous affichez une bannière au milieu de la liste, comme illustré dans la capture d'écran suivante.

a3cd508128793e41.png

  1. Ouvrez le fichier lib/banner_inline_page.dart.
  2. Importez ad_helper.dart et google_mobile_ads.dart en ajoutant les lignes suivantes :
...

// TODO: Import ad_helper.dart
import 'package:admob_inline_ads_in_flutter/ad_helper.dart';

// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';

class BannerInlinePage extends StatefulWidget {
  ...
}
  1. Dans la classe _BannerInlinePageState, ajoutez les éléments et méthodes suivants pour la bannière.

Notez que _kAdIndex indique l'index dans lequel la bannière sera affichée et permet de calculer l'index des éléments de la méthode _getDestinationItemIndex().

banner_inline_page.dart

class _BannerInlinePageState extends State<BannerInlinePage> {

  // TODO: Add _kAdIndex
  static final _kAdIndex = 4;

  // TODO: Add a BannerAd instance
  late BannerAd _ad;

  // TODO: Add _isAdLoaded
  bool _isAdLoaded = false;

  ...

  // TODO: Add _getDestinationItemIndex()
  int _getDestinationItemIndex(int rawIndex) {
    if (rawIndex >= _kAdIndex && _isAdLoaded) {
      return rawIndex - 1;
    }
    return rawIndex;
  }

  ...
}
  1. Dans la méthode initState(), créez et chargez un BannerAd pour la bannière au format 320 x 50 (AdSize.banner). Notez qu'un écouteur d'événements d'annonce est configuré pour mettre à jour l'interface utilisateur (setState()) lors du chargement d'une annonce (MobileAdEvent.loaded).

banner_inline_page.dart

@override
void initState() {
  super.initState();

  // TODO: Create a BannerAd instance
  _ad = BannerAd(
    adUnitId: AdHelper.bannerAdUnitId,
    size: AdSize.banner,
    request: AdRequest(),
    listener: AdListener(
      onAdLoaded: (_) {
        setState(() {
          _isAdLoaded = true;
        });
      },
      onAdFailedToLoad: (ad, error) {
        // Releases an ad resource when it fails to load
        ad.dispose();

        print('Ad load failed (code=${error.code} message=${error.message})');
      },
    ),
  );

  // TODO: Load an ad
  _ad.load();
}
  1. Modifiez la méthode build() pour diffuser une bannière lorsqu'elle est disponible.
  2. Mettez à jour itemCount, pour comptabiliser une entrée de bannière et mettez à jour itemBuilder, pour diffuser une bannière dans l'index des annonces (_kAdIndex) lors du chargement de l'annonce.
  3. Mettez à jour le code pour utiliser la méthode _getDestinationItemIndex() afin de récupérer un index pour l'élément de contenu.

banner_inline_page.dart

@override
Widget build(BuildContext context) {
  return Scaffold(
    ...
    body: ListView.builder(
      // TODO: Adjust itemCount based on the ad load state
      itemCount: widget.entries.length + (_isAdLoaded ? 1 : 0),
      itemBuilder: (context, index) {
        // TODO: Render a banner ad
        if (_isAdLoaded && index == _kAdIndex) {
          return Container(
            child: AdWidget(ad: _ad),
            width: _ad.size.width.toDouble(),
            height: 72.0,
            alignment: Alignment.center,
          );
        } else {
          // TODO: Get adjusted item index from _getDestinationItemIndex()
          final item = widget.entries[_getDestinationItemIndex(index)];

          return ListTile(
            ...
          );
        }
      },
    ),
  );
}
  1. Libérez la ressource associée à l'objet BannerAd en appelant la méthode BannerAd.dispose() dans la méthode de rappel dispose().

banner_inline_page.dart

@override
void dispose() {
  // TODO: Dispose a BannerAd object
  _ad.dispose();

  super.dispose();
}

Et voilà ! Exécutez le projet, puis cliquez sur le bouton Banner inline ad (Bannière intégrée) de la page d'accueil. Une fois l'annonce chargée, une bannière s'affiche au milieu de la liste.

f1372268878a80a2.png c32af50872514224.png

Dans cette section, vous affichez une annonce native au milieu de la liste, comme illustré dans la capture d'écran suivante.

fbe594d5d9ce08ea.png

Les annonces natives sont proposées aux utilisateurs à l'aide de composants d'interface utilisateur natifs pour la plate-forme (par exemple, View sous Android ou UIView sous iOS).

Il n'est cependant pas possible de créer des composants d'interface utilisateur natifs directement à l'aide de widgets Flutter. Vous devez donc mettre en œuvre pour chaque plate-forme un élément NativeAdFactory, qui sert à générer une vue de l'annonce native spécifique à une plate-forme (UnifiedNativeAdView sous Android et GADUnifiedNativeAdView sous iOS) à partir d'un objet d'annonce native (UnifiedNativeAd sous Android et GADUnifiedNativeAd sous iOS).

Mettre en œuvre NativeAdFactory pour Android (Java)

  1. Ouvrez le fichier android/build.gradle (ou tout fichier dans le dossier android), puis cliquez sur Open for Editing in Android Studio (Ouvrir pour modifier dans Android Studio) pour ouvrir un projet Android.

88d3e99426cd8d8c.png

  1. Si vous êtes invité à sélectionner une fenêtre pour ouvrir un nouveau projet, cliquez sur New Window (Nouvelle fenêtre) afin que le projet Flutter reste ouvert pendant que vous travaillez sur le projet Android.

5d554e50a83f2bd1.png

Créer une mise en page des annonces natives

  1. Une fois le projet Android ouvert, faites un clic droit sur app dans le volet Projet d'Android Studio, puis sélectionnez New > Android Resource file (Nouveau > Fichier de ressources Android) dans le menu contextuel.

7b2b6d28d0fe80a9.png

  1. Dans la boîte de dialogue New Resource File (Nouveau fichier de ressources), saisissez list_tile_native_ad.xml comme nom de fichier.
  2. Sélectionnez Layout (Mise en page) comme type de ressource et saisissez com.google.android.gms.ads.formats.UnifiedNativeAdView comme élément racine.
  3. Cliquez sur OK pour créer un fichier de mise en page.

615bf550a2ce9c45.png

  1. Mettez en œuvre la mise en page des annonces comme suit. Notez que la mise en page doit correspondre à la conception visuelle de la plate-forme pour laquelle elle est destinée.

list_tile_native_ad.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.ads.formats.UnifiedNativeAdView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/tv_list_tile_native_ad_attribution_small"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#F19938"
            android:text="Ad"
            android:textColor="#FFFFFF"
            android:textSize="12sp" />

        <ImageView
            android:id="@+id/iv_list_tile_native_ad_icon"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="16dp"
            android:layout_marginLeft="16dp"
            android:scaleType="fitXY"
            tools:background="#EDEDED" />

        <TextView
            android:id="@+id/tv_list_tile_native_ad_attribution_large"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="16dp"
            android:layout_marginLeft="16dp"
            android:background="#F19938"
            android:gravity="center"
            android:text="Ad"
            android:textColor="#FFFFFF"
            android:visibility="invisible" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="80dp"
            android:layout_marginLeft="80dp"
            android:layout_marginEnd="16dp"
            android:layout_marginRight="16dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_list_tile_native_ad_headline"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:lines="1"
                android:maxLines="1"
                android:textColor="#000000"
                android:textSize="16sp"
                tools:text="Headline" />

            <TextView
                android:id="@+id/tv_list_tile_native_ad_body"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:lines="1"
                android:maxLines="1"
                android:textColor="#828282"
                android:textSize="14sp"
                tools:text="body" />

        </LinearLayout>

    </FrameLayout>

</com.google.android.gms.ads.formats.UnifiedNativeAdView>

Créer la classe ListTileNativeAdFactory

  1. Dans le volet Projet, faites un clic droit sur le package com.codelab.flutter.admobinlineads, puis sélectionnez New > Java Class (Nouveau > Classe Java).

609df24b6a0b647e.png

  1. Saisissez ListTileNativeAdFactory comme nom, puis sélectionnez Class (Classe) dans la liste.

642050a1a83d5033.png

  1. Lorsque la boîte de dialogue New Class (Nouvelle classe) s'affiche, laissez ce champ vide et cliquez sur OK.

La classe ListTileNativeAdFactory est créée dans le package com.codelab.flutter.admobinlineads.

3e7c27d864686efa.png

  1. Mettez en œuvre la classe ListTileNativeAdFactory comme suit. Notez que la classe implémente la méthode createNativeAd() dans l'interface GoogleMobileAdsPlugin.NativeAdFactory.

La classe Factory est chargée de créer un objet "view" afin d'afficher une annonce native. Comme vous pouvez le voir dans le code, la classe Factory crée un UnitifedNativeAdView et le remplit avec un objet UnifiedNativeAd.

ListTileNativeAdFactory.java

// TODO: Implement ListTileNativeAdFactory class

package com.codelab.flutter.admobinlineads;

import com.google.android.gms.ads.formats.NativeAd;
import com.google.android.gms.ads.formats.UnifiedNativeAd;
import com.google.android.gms.ads.formats.UnifiedNativeAdView;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Map;

import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin;

class ListTileNativeAdFactory implements GoogleMobileAdsPlugin.NativeAdFactory {

    private final Context context;

    ListTileNativeAdFactory(Context context) {
        this.context = context;
    }

    @Override
    public UnifiedNativeAdView createNativeAd(
            UnifiedNativeAd nativeAd, Map<String, Object> customOptions) {
        UnifiedNativeAdView nativeAdView = (UnifiedNativeAdView) LayoutInflater.from(context)
                .inflate(R.layout.list_tile_native_ad, null);

        TextView attributionViewSmall = nativeAdView
                .findViewById(R.id.tv_list_tile_native_ad_attribution_small);
        TextView attributionViewLarge = nativeAdView
                .findViewById(R.id.tv_list_tile_native_ad_attribution_large);

        ImageView iconView = nativeAdView.findViewById(R.id.iv_list_tile_native_ad_icon);
        NativeAd.Image icon = nativeAd.getIcon();
        if (icon != null) {
            attributionViewSmall.setVisibility(View.VISIBLE);
            attributionViewLarge.setVisibility(View.INVISIBLE);
            iconView.setImageDrawable(icon.getDrawable());
        } else {
            attributionViewSmall.setVisibility(View.INVISIBLE);
            attributionViewLarge.setVisibility(View.VISIBLE);
        }
        nativeAdView.setIconView(iconView);

        TextView headlineView = nativeAdView.findViewById(R.id.tv_list_tile_native_ad_headline);
        headlineView.setText(nativeAd.getHeadline());
        nativeAdView.setHeadlineView(headlineView);

        TextView bodyView = nativeAdView.findViewById(R.id.tv_list_tile_native_ad_body);
        bodyView.setText(nativeAd.getBody());
        bodyView.setVisibility(nativeAd.getBody() != null ? View.VISIBLE : View.INVISIBLE);
        nativeAdView.setBodyView(bodyView);

        nativeAdView.setNativeAd(nativeAd);

        return nativeAdView;
    }
}

Enregistrer la classe ListTileNativeAdFactory

Une instance d'une NativeAdFactory doit être enregistrée dans GoogleMobileAdsPlugin avant de pouvoir être utilisée au niveau de Flutter.

  1. Ouvrez le fichier MainActivity.java et ignorez les méthodes configureFlutterEngine() et cleanUpFlutterEngine().
  2. Enregistrez la classe ListTileNativeAdFactory avec un identifiant de chaîne unique (listTile) dans la méthode configureFlutterEngine().

MainActivity.java

public class MainActivity extends FlutterActivity {

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);

        // TODO: Register the ListTileNativeAdFactory
        GoogleMobileAdsPlugin.registerNativeAdFactory(flutterEngine, "listTile",
                new ListTileNativeAdFactory(getContext()));
    }

    ...
}
  1. Chaque instance NativeAdFactory doit être annulée pendant le processus de nettoyage. Annulez l'enregistrement de la classe ListTileNativeAdFactory dans la méthode cleanUpFlutterEngine().

MainActivity.java

public class MainActivity extends FlutterActivity {

    ...

    @Override
    public void cleanUpFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.cleanUpFlutterEngine(flutterEngine);

        // TODO: Unregister the ListTileNativeAdFactory
        GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "listTile");
    }
}

Vous pouvez à présent utiliser la classe ListTileNativeAdFactory pour afficher des annonces natives sous Android.

Mettre en œuvre NativeAdFactory pour Android (Kotlin)

  1. Ouvrez le fichier android/build.gradle (ou tout fichier dans le dossier android), puis cliquez sur Open for Editing in Android Studio (Ouvrir pour modifier dans Android Studio) pour ouvrir un projet Android.

88d3e99426cd8d8c.png

  1. Si vous êtes invité à sélectionner une fenêtre pour ouvrir un nouveau projet, cliquez sur New Window (Nouvelle fenêtre) afin que le projet Flutter reste ouvert pendant que vous travaillez sur le projet Android.

5d554e50a83f2bd1.png

Créer une mise en page des annonces natives

  1. Une fois le projet Android ouvert, faites un clic droit sur app dans le volet Projet d'Android Studio, puis sélectionnez New > Android Resource file (Nouveau > Fichier de ressources Android) dans le menu contextuel.

7b2b6d28d0fe80a9.png

  1. Dans la boîte de dialogue New Resource File (Nouveau fichier de ressources), saisissez list_tile_native_ad.xml comme nom de fichier.
  2. Sélectionnez Layout (Mise en page) comme type de ressource et saisissez com.google.android.gms.ads.formats.UnifiedNativeAdView comme élément racine.
  3. Cliquez sur OK pour créer un fichier de mise en page.

615bf550a2ce9c45.png

  1. Mettez en œuvre la mise en page des annonces comme suit. Notez que la mise en page doit correspondre à la conception visuelle de la plate-forme pour laquelle elle est destinée.

list_tile_native_ad.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.ads.formats.UnifiedNativeAdView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/tv_list_tile_native_ad_attribution_small"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#F19938"
            android:text="Ad"
            android:textColor="#FFFFFF"
            android:textSize="12sp" />

        <ImageView
            android:id="@+id/iv_list_tile_native_ad_icon"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="16dp"
            android:layout_marginLeft="16dp"
            android:scaleType="fitXY"
            tools:background="#EDEDED" />

        <TextView
            android:id="@+id/tv_list_tile_native_ad_attribution_large"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="16dp"
            android:layout_marginLeft="16dp"
            android:background="#F19938"
            android:gravity="center"
            android:text="Ad"
            android:textColor="#FFFFFF"
            android:visibility="invisible" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="80dp"
            android:layout_marginLeft="80dp"
            android:layout_marginEnd="16dp"
            android:layout_marginRight="16dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_list_tile_native_ad_headline"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:lines="1"
                android:maxLines="1"
                android:textColor="#000000"
                android:textSize="16sp"
                tools:text="Headline" />

            <TextView
                android:id="@+id/tv_list_tile_native_ad_body"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:lines="1"
                android:maxLines="1"
                android:textColor="#828282"
                android:textSize="14sp"
                tools:text="body" />

        </LinearLayout>

    </FrameLayout>

</com.google.android.gms.ads.formats.UnifiedNativeAdView>

Créer la classe ListTileNativeAdFactory

  1. Dans le volet Projet, faites un clic droit sur le package com.codelab.flutter.admobinlineads, puis sélectionnez New > Kotlin File/Class (Nouveau > Fichier/Classe Kotlin).

7311744cb97cad75.png

  1. Saisissez ListTileNativeAdFactory comme nom, puis sélectionnez Class (Classe) dans la liste.

43a6ac7728826d8.png

  1. La classe ListTileNativeAdFactory est créée dans le package com.codelab.flutter.admobinlineads.
  2. Mettez en œuvre la classe ListTileNativeAdFactory comme suit. Notez que la classe implémente la méthode createNativeAd() dans l'interface GoogleMobileAdsPlugin.NativeAdFactory.

La classe Factory est chargée de créer un objet "view" afin d'afficher une annonce native. Comme vous pouvez le voir dans le code, la classe Factory crée un UnitifedNativeAdView et le remplit avec un objet UnifiedNativeAd.

ListTileNativeAdFactory.kt

// TODO: Implement ListTileNativeAdFactory class

package com.codelab.flutter.admobinlineads

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.google.android.gms.ads.formats.UnifiedNativeAd
import com.google.android.gms.ads.formats.UnifiedNativeAdView
import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin

class ListTileNativeAdFactory(val context: Context) : GoogleMobileAdsPlugin.NativeAdFactory {

    override fun createNativeAd(
            nativeAd: UnifiedNativeAd,
            customOptions: MutableMap<String, Any>?
    ): UnifiedNativeAdView {
        val nativeAdView = LayoutInflater.from(context)
                .inflate(R.layout.list_tile_native_ad, null) as UnifiedNativeAdView

        with(nativeAdView) {
            val attributionViewSmall =
                    findViewById<TextView>(R.id.tv_list_tile_native_ad_attribution_small)
            val attributionViewLarge =
                    findViewById<TextView>(R.id.tv_list_tile_native_ad_attribution_large)

            val iconView = findViewById<ImageView>(R.id.iv_list_tile_native_ad_icon)
            val icon = nativeAd.icon
            if (icon != null) {
                attributionViewSmall.visibility = View.VISIBLE
                attributionViewLarge.visibility = View.INVISIBLE
                iconView.setImageDrawable(icon.drawable)
            } else {
                attributionViewSmall.visibility = View.INVISIBLE
                attributionViewLarge.visibility = View.VISIBLE
            }
            this.iconView = iconView

            val headlineView = findViewById<TextView>(R.id.tv_list_tile_native_ad_headline)
            headlineView.text = nativeAd.headline
            this.headlineView = headlineView

            val bodyView = findViewById<TextView>(R.id.tv_list_tile_native_ad_body)
            with(bodyView) {
                text = nativeAd.body
                visibility = if (nativeAd.body.isNotEmpty()) View.VISIBLE else View.INVISIBLE
            }
            this.bodyView = bodyView

            setNativeAd(nativeAd)
        }

        return nativeAdView
    }
}

Enregistrer la classe ListTileNativeAdFactory

Une instance d'une NativeAdFactory doit être enregistrée dans GoogleMobileAdsPlugin avant de pouvoir être utilisée au niveau de Flutter.

  1. Ouvrez le fichier MainActivity.kt et ignorez les méthodes configureFlutterEngine() et cleanUpFlutterEngine().
  2. Enregistrez la classe ListTileNativeAdFactory avec un identifiant de chaîne unique (listTile) dans la méthode configureFlutterEngine().

MainActivity.kt

class MainActivity: FlutterActivity() {

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        // TODO: Register the ListTileNativeAdFactory
        GoogleMobileAdsPlugin.registerNativeAdFactory(
                flutterEngine, "listTile", ListTileNativeAdFactory(context))
    }

    ...
}
  1. Chaque instance NativeAdFactory doit être annulée pendant le processus de nettoyage. Annulez l'enregistrement de la classe ListTileNativeAdFactory dans la méthode cleanUpFlutterEngine().

MainActivity.kt

class MainActivity: FlutterActivity() {
    ...

    override fun cleanUpFlutterEngine(flutterEngine: FlutterEngine) {
        super.cleanUpFlutterEngine(flutterEngine)

        // TODO: Unregister the ListTileNativeAdFactory
        GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "listTile")
    }
}

Vous pouvez à présent utiliser la classe ListTileNativeAdFactory pour afficher des annonces natives sous Android.

Mettre en œuvre NativeAdFactory pour iOS (Objective-C)

Ouvrez le fichier ios/Podfile (ou tout fichier dans le dossier ios), puis cliquez sur Open iOS module in Xcode (Ouvrir le module iOS dans Xcode) pour ouvrir un projet iOS.

8f8b417705df6741.png

Préparer la mise en page des annonces natives

Pour mettre en page des éléments d'annonces natives, vous devez disposer d'une vue personnalisée (*.xib). Dans cet atelier de programmation, la vue préconfigurée permet de minimiser vos efforts.

Une fois le projet iOS ouvert dans Xcode, vérifiez que ListTileNativeAdView.xib existe bien dans le projet Runner.

8551d919ccc41818.png

Créer la classe ListTileNativeAdFactory

  1. Dans le navigateur de projets, faites un clic droit sur le groupe Runner, puis sélectionnez New File (Nouveau fichier) pour créer un fichier d'en-tête pour la nouvelle classe.

249c43a7a1eac87.png

  1. Dans la boîte de dialogue du modèle, sélectionnez Header File (Fichier d'entête) et nommez-le ListTileNativeAdFactory.
  2. Une fois le fichier ListTileNativeAdFactory.h créé, définissez la classe ListNativeAdFactory comme suit :

ListTileNativeAdFactory.h

#ifndef ListTileNativeAdFactory_h
#define ListTileNativeAdFactory_h

// TODO: Import FLTGoogleMobileAdsPlugin.h
#import "FLTGoogleMobileAdsPlugin.h"

// TODO: Declare ListTileNativeAdFactory
@interface ListTileNativeAdFactory : NSObject<FLTNativeAdFactory>

@end

#endif /* ListTileNativeAdFactory_h */
  1. Créez un fichier Objective-C en sélectionnant New File (Nouveau fichier) dans le groupe Runner.
  2. Dans la boîte de dialogue suivante, saisissez ListTileNativeAdFactory dans le champ File (Fichier), puis sélectionnez le type de fichier Empty File (Fichier vide).

26f03ec58f26d1d2.png

  1. Après avoir cliqué sur Next (Suivant), vous êtes invité à choisir le dossier dans lequel créer le fichier. Laissez tout inchangé, puis cliquez sur Créer.

C40f7080bdf513ff.png

  1. Mettez en œuvre la classe ListTileNativeFactory comme suit. Notez que la classe implémente la méthode createNativeAd() dans le protocole FLTNativeAdFactory.

La classe Factory est chargée de créer un objet "view" afin d'afficher une annonce native. Comme vous pouvez le voir dans le code, la classe Factory crée un GADUnitifedNativeAdView et le remplit avec un objet GADUnifiedNativeAd.

ListTileNativeAdFactory.m

// TODO: Import ListTileNativeAdFactory.h
#import "ListTileNativeAdFactory.h"

// TODO: Implement ListTileNativeAdFactory
@implementation ListTileNativeAdFactory

- (GADUnifiedNativeAdView *)createNativeAd:(GADUnifiedNativeAd *)nativeAd
                             customOptions:(NSDictionary *)customOptions {
  GADUnifiedNativeAdView *nativeAdView =
    [[NSBundle mainBundle] loadNibNamed:@"ListTileNativeAdView" owner:nil options:nil].firstObject;

  ((UILabel *)nativeAdView.headlineView).text = nativeAd.headline;

  ((UILabel *)nativeAdView.bodyView).text = nativeAd.body;
  nativeAdView.bodyView.hidden = nativeAd.body ? NO : YES;

  ((UIImageView *)nativeAdView.iconView).image = nativeAd.icon.image;
  nativeAdView.iconView.hidden = nativeAd.icon ? NO : YES;

  nativeAdView.callToActionView.userInteractionEnabled = NO;

  nativeAdView.nativeAd = nativeAd;

  return nativeAdView;
}

@end

Enregistrer la classe ListTileNativeAdFactory

Une mise en œuvre d'une FLTNativeAdFactory doit être enregistrée dans FLTGoogleMobileAdsPlugin avant de pouvoir être utilisée au niveau de Flutter.

Ouvrez le fichier AppDelegate.m, puis enregistrez le ListTileNativeAdFactory avec un ID de chaîne unique (listTile) en appelant la méthode [FLTGoogleMobileAdsPlugin registerNativeAdFactory].

AppDelegate.m

#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"

// TODO: Import ListTileNativeAdFactory.h
#import "ListTileNativeAdFactory.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GeneratedPluginRegistrant registerWithRegistry:self];

  // TODO: Register ListTileNativeAdFactory
  ListTileNativeAdFactory *listTileFactory = [[ListTileNativeAdFactory alloc] init];
  [FLTGoogleMobileAdsPlugin registerNativeAdFactory:self
                                        factoryId:@"listTile"
                                  nativeAdFactory:listTileFactory];

  // Override point for customization after application launch.
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

@end

Vous pouvez à présent utiliser ListTileNativeAdFactory pour afficher des annonces natives sous iOS.

Mettre en œuvre NativeAdFactory pour iOS (Swift)

Ouvrez le fichier ios/Podfile (ou tout fichier dans le dossier ios), puis cliquez sur Open iOS module in Xcode (Ouvrir le module iOS dans Xcode) pour ouvrir un projet iOS.

8f8b417705df6741.png

Préparer la mise en page des annonces natives

Pour mettre en page des éléments d'annonces natives, vous devez disposer d'une vue personnalisée (*.xib). Dans cet atelier de programmation, la vue préconfigurée permet de minimiser vos efforts.

Une fois le projet iOS ouvert dans Xcode, vérifiez que ListTileNativeAdView.xib existe bien dans le projet Runner.

8551d919ccc41818.png

Créer la classe ListTileNativeAdFactory

  1. Dans le navigateur de projets, faites un clic droit sur le groupe Runner, puis sélectionnez New File (Nouveau fichier) pour créer un fichier d'en-tête pour la nouvelle classe.

90bda063c491134.png

  1. Dans la boîte de dialogue du modèle, sélectionnez Swift File (Fichier Swift) et nommez-le ListTileNativeAdFactory.
  2. Une fois le fichier ListTileNativeAdFactory.swift créé, mettez en œuvre la classe ListNativeAdFactory.

Notez que la classe implémente la méthode createNativeAd() dans le protocole FLTNativeAdFactory.

La classe Factory est chargée de créer un objet "view" afin d'afficher une annonce native. Comme vous pouvez le voir dans le code, la classe Factory crée un GADUnitifedNativeAdView et le remplit avec un objet GADUnifiedNativeAd.

ListTileNativeAdFactory.swift

// TODO: Import google_mobile_ads
import google_mobile_ads

// TODO: Implement ListTileNativeAdFactory
class ListTileNativeAdFactory : FLTNativeAdFactory {

    func createNativeAd(_ nativeAd: GADUnifiedNativeAd,
                        customOptions: [AnyHashable : Any]? = nil) -> GADUnifiedNativeAdView? {
        let nibView = Bundle.main.loadNibNamed("ListTileNativeAdView", owner: nil, options: nil)!.first
        let nativeAdView = nibView as! GADUnifiedNativeAdView

        (nativeAdView.headlineView as! UILabel).text = nativeAd.headline

        (nativeAdView.bodyView as! UILabel).text = nativeAd.body
        nativeAdView.bodyView!.isHidden = nativeAd.body == nil

        (nativeAdView.iconView as! UIImageView).image = nativeAd.icon?.image
        nativeAdView.iconView!.isHidden = nativeAd.icon == nil

        nativeAdView.callToActionView?.isUserInteractionEnabled = false

        nativeAdView.nativeAd = nativeAd

        return nativeAdView
    }
}

Enregistrez la classe ListTileNativeAdFactory

Une mise en œuvre d'une FLTNativeAdFactory doit être enregistrée dans FLTGoogleMobileAdsPlugin avant de pouvoir être utilisée au niveau de Flutter.

Ouvrez le fichier AppDelegate.m, puis enregistrez le ListTileNativeAdFactory avec un ID de chaîne unique (listTile) en appelant la méthode FLTGoogleMobileAdsPlugin.registerNativeAdFactory().

AppDelegate.swift

import UIKit
import Flutter

// TODO: Import google_mobile_ads
import google_mobile_ads

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    // TODO: Register ListTileNativeAdFactory
    let listTileFactory = ListTileNativeAdFactory()
    FLTGoogleMobileAdsPlugin.registerNativeAdFactory(
        self, factoryId: "listTile", nativeAdFactory: listTileFactory)

    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

Vous pouvez à présent utiliser ListTileNativeAdFactory pour afficher des annonces natives sous iOS.

Intégrer l'annonce native avec des widgets Flutter

  1. Ouvrez le fichier lib/native_inline_page.dart. Importez ensuite ad_helper.dart et google_mobile_ads.dart en ajoutant les lignes suivantes :

native_inline_page.dart

...

// TODO: Import ad_helper.dart
import 'package:admob_inline_ads_in_flutter/ad_helper.dart';

// TODO: Import google_mobile_ads.dart
import 'package:google_mobile_ads/google_mobile_ads.dart';

class NativeInlinePage extends StatefulWidget {
  ...
}
  1. Dans la classe _NativeInlinePageState, ajoutez les éléments et méthodes suivants pour l'annonce native.

Notez que _kAdIndex indique l'index dans lequel la bannière sera affichée et permet de calculer l'index des éléments de la méthode _getDestinationItemIndex().

native_inline_page.dart

class _NativeInlinePageState extends State<NativeInlinePage> {

  // TODO: Add _kAdIndex
  static final _kAdIndex = 4;

  // TODO: Add a NativeAd instance
  late NativeAd _ad;

  // TODO: Add _isAdLoaded
  bool _isAdLoaded = false;

  ...

  // TODO: Add _getDestinationItemIndex()
  int _getDestinationItemIndex(int rawIndex) {
    if (rawIndex >= _kAdIndex && _isAdLoaded) {
      return rawIndex - 1;
    }
    return rawIndex;
  }

  ...
}
  1. Dans la méthode initState(), créez et chargez un NativeAd qui utilise ListTileNativeAdFactory pour générer une vue d'annonce native.

Notez que l'ID d'usine (listTile) correspond à celui utilisé pour enregistrer la configuration d'usine du plug-in.

native_inline_page.dart

@override
void initState() {
  super.initState();

  // TODO: Create a NativeAd instance
  _ad = NativeAd(
    adUnitId: AdHelper.nativeAdUnitId,
    factoryId: 'listTile',
    request: AdRequest(),
    listener: AdListener(
      onAdLoaded: (_) {
        setState(() {
          _isAdLoaded = true;
        });
      },
      onAdFailedToLoad: (ad, error) {
        // Releases an ad resource when it fails to load
        ad.dispose();

        print('Ad load failed (code=${error.code} message=${error.message})');       },
    ),
  );

  _ad.load();
}
  1. Modifiez la méthode build() pour diffuser une bannière lorsqu'elle est disponible.
  2. Mettez à jour itemCount, pour comptabiliser une entrée de bannière et itemBuilder, pour diffuser une bannière dans l'index des annonces (_kAdIndex) lors du chargement de l'annonce.
  3. Mettez à jour le code pour utiliser la méthode _getDestinationItemIndex() afin de récupérer un index pour l'élément de contenu.

native_inline_page.dart

@override
Widget build(BuildContext context) {
  return Scaffold(
    ...
    body: ListView.builder(
      // TODO: Adjust itemCount based on the ad load state
      itemCount: widget.entries.length + (_isAdLoaded ? 1 : 0),
      itemBuilder: (context, index) {
        // TODO: Render a banner ad
        if (_isAdLoaded && index == _kAdIndex) {
          return Container(
            child: AdWidget(ad: _ad),
            height: 72.0,
            alignment: Alignment.center,
          );
        } else {
          // TODO: Get adjusted item index from _getDestinationItemIndex()
          final item = widget.entries[_getDestinationItemIndex(index)];

          return ListTile(
            ...
          );
        }
      },
    ),
  );
}
  1. Libérez la ressource associée à l'objet NativeAd en appelant la méthode NativeAd.dispose() dans la méthode de rappel dispose().

native_inline_page.dart

@override
void dispose() {
  // TODO: Dispose a NativeAd object
  _ad.dispose();

  super.dispose();
}

Et voilà ! Exécutez le projet, puis cliquez sur le bouton Native inline ad (Annonce native intégrée) sur la page d'accueil. Une fois l'annonce chargée, une annonce native s'affiche au milieu de la liste.

fbe594d5d9ce08ea.png 5ead873222c800eb.png

Vous avez terminé cet atelier de programmation. Vous trouverez le code final de cet atelier de programmation dans le dossier android_studio_folder.png complete ou le dossier android_studio_folder.png complete_kotlin_swift.