การเพิ่มโฆษณา AdMob ลงในแอป Flutter

1. บทนำ

สิ่งที่คุณจะสร้าง

Codelab นี้จะแนะนำวิธีเพิ่มแบนเนอร์ โฆษณาคั่นระหว่างหน้า และโฆษณาที่มีการให้รางวัลลงในแอปชื่อแบบทดสอบการวาดภาพสุดเจ๋ง ซึ่งเป็นเกมที่ให้ผู้เล่นเดาชื่อภาพวาดได้

หากพบปัญหา (ข้อบกพร่องของโค้ด ข้อผิดพลาดด้านไวยากรณ์ การใช้คำไม่ชัดเจน) ขณะดำเนินการใน Codelab นี้ โปรดรายงานปัญหาโดยคลิกลิงก์รายงานข้อผิดพลาดที่มุมล่างซ้ายของ Codelab

สิ่งที่คุณจะได้เรียนรู้

  • วิธีกำหนดค่าปลั๊กอิน AdMob สำหรับโฆษณาบนมือถือของ Google
  • วิธีใช้แบนเนอร์ โฆษณาคั่นระหว่างหน้า และโฆษณาที่มีการให้รางวัลในแอป Flutter

สิ่งที่คุณต้องมี

  • Android Studio 4.1 ขึ้นไป
  • Xcode 12 ขึ้นไป (สำหรับการพัฒนา iOS)

คุณจะให้คะแนนประสบการณ์การใช้งาน AdMob ในระดับใด

มือใหม่ ระดับกลาง ผู้ชำนาญ

โปรดให้คะแนนประสบการณ์การใช้งาน Flutter ของคุณ

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ Flutter

ห้องทดลองนี้ต้องมีซอฟต์แวร์ 2 ประเภท ได้แก่ Flutter SDK และเครื่องมือแก้ไข

คุณเรียกใช้ Codelab ได้โดยใช้อุปกรณ์ต่อไปนี้

  • อุปกรณ์ Android หรือ iOS ที่เชื่อมต่อกับคอมพิวเตอร์และตั้งค่าเป็นโหมดนักพัฒนาซอฟต์แวร์
  • เครื่องมือจำลอง iOS (ต้องติดตั้งเครื่องมือ Xcode)
  • โปรแกรมจำลอง Android (ต้องตั้งค่าใน Android Studio)
  • เบราว์เซอร์ (การแก้ไขข้อบกพร่องต้องใช้ Chrome)
  • เป็นแอปพลิเคชัน Windows, Linux หรือ macOS บนเดสก์ท็อป คุณต้องพัฒนาบนแพลตฟอร์มที่คุณวางแผนจะทำให้ใช้งานได้ ดังนั้นหากต้องการพัฒนาแอป Windows บนเดสก์ท็อป คุณต้องพัฒนาบน Windows เพื่อเข้าถึงเชนบิลด์ที่เหมาะสม มีข้อกำหนดเฉพาะระบบปฏิบัติการที่ครอบคลุมรายละเอียดใน docs.flutter.dev/desktop

ดาวน์โหลดโค้ด

หลังจากที่ดาวน์โหลดไฟล์ ZIP แล้ว ให้แตกเนื้อหาในไฟล์ คุณจะมีโฟลเดอร์ชื่อ admob-ads-in-flutter-master

หรือจะโคลนที่เก็บ GitHub จากบรรทัดคำสั่งก็ได้ ดังนี้

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

ที่เก็บมี 2 โฟลเดอร์ดังนี้

  • android_studio_folder.pngstarter — โค้ดเริ่มต้นที่คุณจะสร้างใน Codelab นี้
  • android_studio_folder.pngเสร็จสมบูรณ์ — โค้ดสำหรับ Codelab นี้เสร็จสมบูรณ์แล้ว

3. ตั้งค่าแอปและหน่วยโฆษณา AdMob

เนื่องจาก Flutter เป็น SDK หลายแพลตฟอร์ม คุณต้องเพิ่มแอปและหน่วยโฆษณาสําหรับทั้ง Android และ iOS ใน AdMob

ตั้งค่าสำหรับ Android

หากต้องการตั้งค่าสำหรับ Android คุณต้องเพิ่มแอป Android และสร้างหน่วยโฆษณา

เพิ่มแอป Android

  1. ในคอนโซล AdMob ให้คลิกเพิ่มแอปจากเมนูแอป
  2. เมื่อระบบถามว่าคุณได้เผยแพร่แอปใน Google Play หรือ App Store หรือยัง ให้คลิกไม่
  3. ป้อน Awesome Drawing Quiz ในช่องชื่อแอป แล้วเลือกแพลตฟอร์มเป็น Android

ddafee37a6f92229.png

  1. คุณไม่จำเป็นต้องเปิดใช้เมตริกผู้ใช้เพื่อดำเนินการ Codelab นี้ให้เสร็จสมบูรณ์ แต่เราขอแนะนําให้คุณทำเช่นนั้น เนื่องจากจะช่วยให้คุณเข้าใจพฤติกรรมของผู้ใช้ได้ละเอียดยิ่งขึ้น คลิกเพิ่มเพื่อดำเนินการให้เสร็จสมบูรณ์

b918bf44362813a9.png

สร้างหน่วยโฆษณา

วิธีเริ่มเพิ่มหน่วยโฆษณาลงใน AdMob

  1. เลือกแบบทดสอบการวาดภาพสุดเจ๋งจากเมนูแอปในคอนโซล AdMob
  2. คลิกเมนูหน่วยโฆษณา

แบนเนอร์

  1. คลิกปุ่มเพิ่มหน่วยโฆษณา
  2. เลือกแบนเนอร์เป็นรูปแบบ
  3. ป้อน android-adq-banner ในช่องชื่อหน่วยโฆษณา
  4. คลิกสร้างหน่วยโฆษณาเพื่อดำเนินการให้เสร็จสมบูรณ์

โฆษณาคั่นระหว่างหน้า

  1. คลิกปุ่มเพิ่มหน่วยโฆษณา
  2. เลือกรูปแบบโฆษณาคั่นระหว่างหน้า
  3. ป้อน android-adq-interstitial ในช่องชื่อหน่วยโฆษณา
  4. คลิกสร้างหน่วยโฆษณาเพื่อดำเนินการให้เสร็จสมบูรณ์

โฆษณาที่มีการให้รางวัล

  1. คลิกปุ่มเพิ่มหน่วยโฆษณา
  2. เลือกรูปแบบมีการให้รางวัล
  3. ป้อน android-adq-rewarded ในช่องชื่อหน่วยโฆษณา
  4. ปล่อยค่าเริ่มต้นสำหรับการตั้งค่ารางวัล
  5. คลิกสร้างหน่วยโฆษณาเพื่อดำเนินการให้เสร็จสมบูรณ์

โดยปกติแล้วหน่วยโฆษณาใหม่จะใช้เวลา 2-3 ชั่วโมงจึงจะแสดงโฆษณาได้

หากต้องการทดสอบลักษณะการทำงานของโฆษณาทันที ให้ใช้รหัสแอปทดสอบและรหัสหน่วยโฆษณาที่ระบุไว้ในรหัสแอป Android/รหัสหน่วยโฆษณา และรหัสแอป iOS/รหัสหน่วยโฆษณาในตาราง

ตั้งค่าสําหรับ iOS

หากต้องการตั้งค่าสำหรับ iOS คุณต้องเพิ่มแอป iOS และสร้างหน่วยโฆษณา

เพิ่มแอป iOS

  1. ในคอนโซล AdMob ให้คลิกเพิ่มแอปจากเมนูแอป
  2. เมื่อระบบถามว่าคุณได้เผยแพร่แอปใน Google Play หรือ App Store หรือยัง ให้คลิกไม่
  3. ป้อน Awesome Drawing Quiz ในช่องชื่อแอป แล้วเลือก iOS เป็นแพลตฟอร์ม

93e7f9f114232402.png

  1. คุณไม่จำเป็นต้องเปิดใช้เมตริกผู้ใช้เพื่อดำเนินการ Codelab นี้ให้เสร็จสมบูรณ์ แต่เราขอแนะนําให้คุณทำเช่นนั้น เนื่องจากจะช่วยให้คุณเข้าใจพฤติกรรมของผู้ใช้ได้ละเอียดยิ่งขึ้น คลิกเพิ่มเพื่อดำเนินการให้เสร็จสมบูรณ์

b918bf44362813a9.png

สร้างหน่วยโฆษณา

วิธีเพิ่มหน่วยโฆษณา

  1. เลือกแอปแบบทดสอบการวาดภาพสุดเจ๋งจากเมนูแอปในคอนโซล AdMob
  2. คลิกเมนูหน่วยโฆษณา

แบนเนอร์

  1. คลิกปุ่มเพิ่มหน่วยโฆษณา
  2. เลือกแบนเนอร์เป็นรูปแบบ
  3. ป้อน ios-adq-banner ในช่องชื่อหน่วยโฆษณา
  4. คลิกสร้างหน่วยโฆษณาเพื่อดำเนินการให้เสร็จสมบูรณ์

โฆษณาคั่นระหว่างหน้า

  1. คลิกปุ่มเพิ่มหน่วยโฆษณา
  2. เลือกรูปแบบโฆษณาคั่นระหว่างหน้า
  3. ป้อน ios-adq-interstitial ในช่องชื่อหน่วยโฆษณา
  4. คลิกสร้างหน่วยโฆษณาเพื่อดำเนินการให้เสร็จสมบูรณ์

โฆษณาที่มีการให้รางวัล

  1. คลิกปุ่มเพิ่มหน่วยโฆษณา
  2. เลือกรูปแบบมีการให้รางวัล
  3. ป้อน ios-adq-rewarded ในช่องชื่อหน่วยโฆษณา
  4. ปล่อยค่าเริ่มต้นสำหรับการตั้งค่ารางวัล
  5. คลิกสร้างหน่วยโฆษณาเพื่อดำเนินการให้เสร็จสมบูรณ์

โดยปกติแล้วหน่วยโฆษณาใหม่จะใช้เวลา 2-3 ชั่วโมงจึงจะแสดงโฆษณาได้

หากต้องการทดสอบลักษณะการทำงานของโฆษณาทันที ให้ใช้รหัสแอปทดสอบและรหัสหน่วยโฆษณาที่ระบุไว้ในตารางต่อไปนี้

ไม่บังคับ: ใช้แอปและหน่วยโฆษณาทดสอบของ AdMob

หากคุณต้องการใช้ Codelab แทนการสร้างแอปพลิเคชันและหน่วยโฆษณาใหม่ด้วยตนเอง คุณสามารถใช้รหัสแอป AdMob และรหัสหน่วยโฆษณาทดสอบในตารางต่อไปนี้

รหัสแอป Android/รหัสหน่วยโฆษณา

รายการ

รหัสแอป/รหัสหน่วยโฆษณา

รหัสแอป AdMob

ca-app-pub-3940256099942544~3347511713

แบนเนอร์

ca-app-pub-3940256099942544/6300978111

โฆษณาคั่นระหว่างหน้า

ca-app-pub-3940256099942544/1033173712

ได้รับรางวัลแล้ว

ca-app-pub-3940256099942544/5224354917

รหัสแอป iOS/รหัสหน่วยโฆษณา

รายการ

รหัสแอป/รหัสหน่วยโฆษณา

รหัสแอป AdMob

ca-app-pub-3940256099942544~1458002511

แบนเนอร์

ca-app-pub-3940256099942544/2934735716

โฆษณาคั่นระหว่างหน้า

ca-app-pub-3940256099942544/4411468910

ได้รับรางวัลแล้ว

ca-app-pub-3940256099942544/1712485313

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโฆษณาทดสอบ โปรดดูเอกสารสำหรับนักพัฒนาซอฟต์แวร์โฆษณาทดสอบ Android และโฆษณาทดสอบ iOS

4. เพิ่มปลั๊กอิน Flutter ของ Google Mobile Ads

Flutter ใช้ปลั๊กอินเพื่อเข้าถึงบริการเฉพาะแพลตฟอร์มที่หลากหลาย ปลั๊กอินช่วยให้คุณเข้าถึงบริการและ API ในแต่ละแพลตฟอร์มได้

ปลั๊กอิน google_mobile_ads รองรับการโหลดและการแสดงแบนเนอร์ โฆษณาคั่นระหว่างหน้า โฆษณาที่มีการให้รางวัล และโฆษณาเนทีฟโดยใช้ AdMob API

เนื่องจาก Flutter เป็น SDK หลายแพลตฟอร์ม ปลั๊กอิน google_mobile_ads จึงใช้งานได้สำหรับทั้ง iOS และ Android ดังนั้น หากคุณเพิ่มปลั๊กอินลงในแอป Flutter แอปโฆษณาแบบอินไลน์ของ AdMob ทั้งเวอร์ชัน Android และ iOS จะใช้ปลั๊กอินดังกล่าว

เพิ่มปลั๊กอินโฆษณาในอุปกรณ์เคลื่อนที่ของ Google เป็นทรัพยากร Dependency

หากต้องการเข้าถึง AdMob API จากโปรเจ็กต์โฆษณาในบรรทัดของ AdMob ให้เพิ่ม google_mobile_ads เป็นทรัพยากร Dependency ไปยังไฟล์ pubspec.yaml ที่รูทของโปรเจ็กต์

pubspec.yaml

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

dependencies:
  flutter:
    sdk: flutter
  google_fonts: ^3.0.1

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

...

คลิก Pub get เพื่อติดตั้งปลั๊กอินในโครงการ Awesome Drawing Quiz

9ce73858eedbd8fc.png

อัปเดต AndroidManifest.xml (Android)

  1. เปิดไฟล์ android/app/src/main/AndroidManifest.xml ใน Android Studio
  2. เพิ่มรหัสแอป AdMob โดยเพิ่มแท็ก <meta-data> ที่ใช้ชื่อ com.google.android.gms.ads.APPLICATION_ID ตัวอย่างเช่น หากรหัสแอป AdMob คือ ca-app-pub-3940256099942544~3347511713 คุณจะต้องเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ 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>

อัปเดต Info.plist (iOS)

  1. เปิดไฟล์ ios/Runner/Info.plist ใน Android Studio
  2. เพิ่มคีย์ GADApplicationIdentifier ด้วยค่าสตริงของรหัสแอป AdMob ตัวอย่างเช่น หากรหัสแอป AdMob คือ ca-app-pub-3940256099942544~1458002511 คุณจะต้องเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ Info.plist

ios/Runner/Info.plist

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

5. เพิ่มคลาสตัวช่วยสำหรับโฆษณา

สร้างไฟล์ใหม่ชื่อ ad_helper.dart ภายใต้ไดเรกทอรี lib จากนั้นใช้คลาส AdHelper ซึ่งระบุรหัสแอป AdMob และรหัสหน่วยโฆษณาสำหรับ Android และ iOS

โปรดแทนที่รหัสแอป AdMob (ca-app-pub-xxxxxx~yyyyy) และรหัสหน่วยโฆษณา (ca-app-pub-xxxxxxx/yyyyyyyy) ด้วยรหัสที่คุณสร้างในขั้นตอนก่อนหน้า

lib/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 UnsupportedError('Unsupported platform');
    }
  }

  static String get interstitialAdUnitId {
    if (Platform.isAndroid) {
      return '<YOUR_ANDROID_INTERSTITIAL_AD_UNIT_ID>';
    } else if (Platform.isIOS) {
      return '<YOUR_IOS_INTERSTITIAL_AD_UNIT_ID>';
    } else {
      throw UnsupportedError('Unsupported platform');
    }
  }

  static String get rewardedAdUnitId {
    if (Platform.isAndroid) {
      return '<YOUR_ANDROID_REWARDED_AD_UNIT_ID>';
    } else if (Platform.isIOS) {
      return '<YOUR_IOS_REWARDED_AD_UNIT_ID>';
    } else {
      throw UnsupportedError('Unsupported platform');
    }
  }
}

ใช้ข้อมูลโค้ดต่อไปนี้หากคุณต้องการใช้รหัสแอป AdMob ทดสอบและรหัสหน่วยโฆษณาทดสอบ

lib/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';
    } else {
      throw new UnsupportedError('Unsupported platform');
    }
  }

  static String get interstitialAdUnitId {
    if (Platform.isAndroid) {
      return "ca-app-pub-3940256099942544/1033173712";
    } else if (Platform.isIOS) {
      return "ca-app-pub-3940256099942544/4411468910";
    } else {
      throw new UnsupportedError("Unsupported platform");
    }
  }

  static String get rewardedAdUnitId {
    if (Platform.isAndroid) {
      return "ca-app-pub-3940256099942544/5224354917";
    } else if (Platform.isIOS) {
      return "ca-app-pub-3940256099942544/1712485313";
    } else {
      throw new UnsupportedError("Unsupported platform");
    }
  }
}

6. เริ่มต้น SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google

ก่อนที่จะโหลดโฆษณา คุณจะต้องเริ่มต้น SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google ก่อน เปิดไฟล์ lib/home_route.dart และแก้ไข _initGoogleMobileAds() เพื่อเริ่มต้น SDK ก่อนที่หน้าแรกจะโหลด

โปรดทราบว่าคุณต้องเปลี่ยนประเภทการแสดงผลของเมธอด _initGoogleMobileAds() จาก Future<dynamic> เป็น Future<InitializationStatus> เพื่อรับผลการเริ่มต้น SDK หลังจากการดำเนินการเสร็จสมบูรณ์

home_route.dart

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

import 'package:flutter/material.dart';

...

class HomeRoute extends StatelessWidget {

  ...

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

7. เพิ่มโฆษณาแบนเนอร์

ในส่วนนี้ คุณจะแสดงโฆษณาแบนเนอร์ที่ด้านบนของหน้าจอเกม ดังที่แสดงในภาพหน้าจอต่อไปนี้

276b4cfa283ea6c7.png

  1. เปิดไฟล์ lib/game_route.dart และนำเข้า ad_manager.dart
  2. นำเข้า ad_helper.dart และ google_mobile_ads.dart ด้วยการเพิ่มบรรทัดต่อไปนี้

lib/game_route.dart

...

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

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

class GameRoute extends StatefulWidget {
  ...
}
  1. ในชั้นเรียน _GameRouteState ให้เพิ่มสมาชิกต่อไปนี้สำหรับโฆษณาแบนเนอร์

lib/game_route.dart

class _GameRouteState extends State<GameRoute> implements QuizEventListener {

  ...

  // TODO: Add _bannerAd
  BannerAd? _bannerAd;

  ...
}
  1. ในเมธอด initState() ให้สร้างและโหลด BannerAd สำหรับแบนเนอร์ 320x50 (AdSize.banner) โปรดทราบว่า Listener เหตุการณ์โฆษณามีการกำหนดค่าให้อัปเดต UI (setState()) เมื่อโหลดโฆษณา

lib/game_route.dart

@override
void initState() {
  ...

  // TODO: Load a banner ad
  BannerAd(
    adUnitId: AdHelper.bannerAdUnitId,
    request: AdRequest(),
    size: AdSize.banner,
    listener: BannerAdListener(
      onAdLoaded: (ad) {
        setState(() {
          _bannerAd = ad as BannerAd;
        });
      },
      onAdFailedToLoad: (ad, err) {
        print('Failed to load a banner ad: ${err.message}');
        ad.dispose();
      },
    ),
  ).load();
}
  1. แก้ไขเมธอด build() เพื่อแสดงโฆษณาแบนเนอร์เมื่อพร้อมใช้งาน

lib/game_route.dart

@override
Widget build(BuildContext context) {
  return Scaffold(
    ...
    body: SafeArea(
      child: Stack(
        children: [
          Center(
            ...
          ),
          // TODO: Display a banner when ready
          if (_bannerAd != null)
            Align(
              alignment: Alignment.topCenter,
              child: Container(
                width: _bannerAd!.size.width.toDouble(),
                height: _bannerAd!.size.height.toDouble(),
                child: AdWidget(ad: _bannerAd!),
              ),
            ),
        ],
      ),
    ),
    ...
  );
}
  1. ปล่อยทรัพยากรที่เชื่อมโยงกับออบเจ็กต์ BannerAd โดยการเรียกใช้เมธอด BannerAd.dispose() ในเมธอด Callback dispose()

lib/game_route.dart

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

  ...

  super.dispose();
}

เท่านี้ก็เรียบร้อย ทำโปรเจ็กต์และเริ่มเกมใหม่ หลังจากที่โฆษณาโหลดแล้ว คุณจะเห็นโฆษณาแบนเนอร์ที่ด้านบนของหน้าจอ

276b4cfa283ea6c7.png

8. เพิ่มโฆษณาคั่นระหว่างหน้า

ในส่วนนี้ คุณจะแสดงโฆษณาคั่นระหว่างหน้าหลังจากเล่นเกมจบ (ทั้งหมด 5 ระดับ)

  1. เปิดไฟล์ lib/game_route.dart
  2. ในชั้นเรียน _GameRouteState ให้เพิ่มสมาชิกและวิธีการต่อไปนี้สำหรับโฆษณาคั่นระหว่างหน้า

โปรดทราบว่า Listener เหตุการณ์โฆษณาจะมีการกำหนดค่าให้ตรวจสอบว่าโฆษณาพร้อมหรือไม่ (onAdLoaded() และ onAdFailedToLoad()) และให้แสดงหน้าจอหลักของแอปเมื่อโฆษณาปิดอยู่ (onAdDismissedFullScreenContent())

lib/game_route.dart

class _GameRouteState extends State<GameRoute> implements QuizEventListener {

  ...

  // TODO: Add _interstitialAd
 InterstitialAd? _interstitialAd;

  // TODO: Implement _loadInterstitialAd()
  void _loadInterstitialAd() {
    InterstitialAd.load(
      adUnitId: AdHelper.interstitialAdUnitId,
      request: AdRequest(),
      adLoadCallback: InterstitialAdLoadCallback(
        onAdLoaded: (ad) {
          ad.fullScreenContentCallback = FullScreenContentCallback(
            onAdDismissedFullScreenContent: (ad) {
              _moveToHome();
            },
          );

          setState(() {
            _interstitialAd = ad;
          });
        },
        onAdFailedToLoad: (err) {
          print('Failed to load an interstitial ad: ${err.message}');
        },
      ),
    );
  }

  ...
}
  1. ใน Codelab นี้ โฆษณาคั่นระหว่างหน้าจะแสดงหลังจากที่ผู้ใช้เล่นผ่าน 5 ระดับ ในการลดคำขอโฆษณาที่ไม่จำเป็น ให้ขอโฆษณาเมื่อผู้ใช้เล่นถึงด่าน 3

เพิ่มบรรทัดต่อไปนี้ในเมธอด onNewLevel()

lib/game_route.dart

@override
void onNewLevel(int level, Drawing drawing, String clue) {
  ...

  // TODO: Load an Interstitial Ad
  if (level >= 3 && _interstitialAd == null) {
    _loadInterstitialAd();
  }
}
  1. เมื่อการแข่งขันจบ กล่องโต้ตอบคะแนนการแข่งขันจะปรากฏขึ้น เมื่อผู้ใช้ปิดกล่องโต้ตอบ ระบบจะนำผู้ใช้ไปยังหน้าจอหลักของแบบทดสอบการวาดภาพสุดเจ๋ง

เนื่องจากโฆษณาคั่นระหว่างหน้าควรแสดงระหว่างการเปลี่ยนหน้าจอ เราจึงแสดงโฆษณาคั่นระหว่างหน้าเมื่อผู้ใช้คลิกปุ่มปิด

แก้ไขเมธอด onGameOver() ดังนี้

lib/game_route.dart

@override
void onGameOver(int correctAnswers) {
  showDialog(
    context: _scaffoldKey.currentContext,
    builder: (context) {
      return AlertDialog(
        title: Text('Game over!'),
        content: Text('Score: $correctAnswers/5'),
        actions: [
          FlatButton(
            child: Text('close'.toUpperCase()),
            onPressed: () {

              // TODO: Display an Interstitial Ad
              if (_interstitialAd != null) {
                _interstitialAd?.show();
              } else {
                _moveToHome();
              }
            },
          ),
        ],
      );
    },
  );
}
  1. ปล่อยทรัพยากรที่เชื่อมโยงกับออบเจ็กต์ InterstitialAd โดยการเรียกใช้เมธอด InterstitialAd.dispose() ในเมธอด Callback dispose()

lib/game_route.dart

@override
void dispose() {
  ...

  // TODO: Dispose an InterstitialAd object
  _interstitialAd?.dispose();

  ...

  super.dispose();
}

เท่านี้ก็เรียบร้อย ดำเนินโปรเจ็กต์และเล่นเกมให้เสร็จสมบูรณ์ หากโฆษณาคั่นระหว่างหน้าโหลดขึ้นมา คุณจะเห็นโฆษณาคั่นระหว่างหน้าเมื่อคลิกปุ่มปิดจากกล่องโต้ตอบคะแนน

c546e438c405e941.gif

9. เพิ่มโฆษณาที่มีการให้รางวัล

ในส่วนนี้ คุณจะเพิ่มโฆษณาที่มีการให้รางวัล ซึ่งให้คำแนะนำเพิ่มเติมแก่ผู้ใช้เป็นรางวัล

  1. เปิดไฟล์ lib/game_route.dart
  2. ในคลาส _GameRouteState ให้เพิ่มสมาชิกสำหรับโฆษณาที่มีการให้รางวัลและใช้เมธอด _loadRewardedAd() โปรดทราบว่าโฆษณาจะโหลดโฆษณาที่มีการให้รางวัลอื่นเมื่อปิดโฆษณา (onAdDismissedFullScreenContent) เพื่อแคชโฆษณาโดยเร็วที่สุด

lib/game_route.dart

class _GameRouteState extends State<GameRoute> implements QuizEventListener {

  ...

  // TODO: Add _rewardedAd
  RewardedAd? _rewardedAd;

  // TODO: Implement _loadRewardedAd()
  void _loadRewardedAd() {
    RewardedAd.load(
      adUnitId: AdHelper.rewardedAdUnitId,
      request: AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
        onAdLoaded: (ad) {
          ad.fullScreenContentCallback = FullScreenContentCallback(
            onAdDismissedFullScreenContent: (ad) {
              setState(() {
                ad.dispose();
                _rewardedAd = null;
              });
              _loadRewardedAd();
            },
          );

          setState(() {
            _rewardedAd = ad;
          });
        },
        onAdFailedToLoad: (err) {
          print('Failed to load a rewarded ad: ${err.message}');
        },
      ),
    );
  }

  ...
}
  1. เรียกใช้ _loadRewardedAd() จากเมธอด initState() เพื่อขอโฆษณาที่มีการให้รางวัลเมื่อเกมเริ่ม

lib/game_route.dart

class _GameRouteState extends State<GameRoute> implements QuizEventListener {

  ...

  @override
  void initState() {
    ...

    // COMPLETE: Load a Rewarded Ad
    _loadRewardedAd();
  }


  ...
}
  1. อนุญาตให้ผู้ใช้ดูโฆษณาที่มีการให้รางวัลได้โดยคลิกปุ่มการทำงานแบบลอย ปุ่มนี้จะแสดงเฉพาะเมื่อผู้ใช้ไม่ได้ใช้คำแนะนำที่ระดับปัจจุบันและโหลดโฆษณาที่มีการให้รางวัลแล้ว

แก้ไขเมธอด _buildFloatingActionButton() ดังนี้ เพื่อแสดงปุ่มการทำงานแบบลอย โปรดทราบว่าการแสดง null จะเป็นการซ่อนปุ่มจากหน้าจอ

โปรดทราบว่า onUserEarnedReward เป็นเหตุการณ์โฆษณาที่สำคัญที่สุดในโฆษณาที่มีการให้รางวัล ทริกเกอร์นี้เมื่อผู้ใช้มีสิทธิ์ได้รับรางวัล (เช่น ดูวิดีโอจบแล้ว)

ใน Codelab นี้ ระบบจะเรียกเมธอด QuizManager.instance.useHint() จาก Callback ซึ่งจะแสดงอักขระอีก 1 ตัวในสตริงคำแนะนำ แอปจะโหลดโฆษณาที่มีการให้รางวัลซ้ำใน Callback onAdClosed เพื่อให้แน่ใจว่าโฆษณาจะพร้อมใช้งานโดยเร็วที่สุด

lib/game_route.dart

Widget? _buildFloatingActionButton() {
  // TODO: Return a FloatingActionButton if a rewarded ad is available
  return (!QuizManager.instance.isHintUsed && _rewardedAd != null)
      ? FloatingActionButton.extended(
          onPressed: () {
            showDialog(
              context: context,
              builder: (context) {
                return AlertDialog(
                  title: Text('Need a hint?'),
                  content: Text('Watch an Ad to get a hint!'),
                  actions: [
                    TextButton(
                      child: Text('cancel'.toUpperCase()),
                      onPressed: () {
                        Navigator.pop(context);
                      },
                    ),
                    TextButton(
                      child: Text('ok'.toUpperCase()),
                      onPressed: () {
                        Navigator.pop(context);
                        _rewardedAd?.show(
                          onUserEarnedReward: (_, reward) {
                            QuizManager.instance.useHint();
                          },
                        );
                      },
                    ),
                  ],
                );
              },
            );
          },
          label: Text('Hint'),
          icon: Icon(Icons.card_giftcard),
        )
      : null;
}
  1. ปล่อยทรัพยากรที่เชื่อมโยงกับออบเจ็กต์ RewardedAd โดยการเรียกใช้เมธอด RewardedAd.dispose() ในเมธอด Callback dispose()

lib/game_route.dart

@override
void dispose() {
  ...

  // TODO: Dispose a RewardedAd object
  _rewardedAd?.dispose();

  ...

  super.dispose();
}

เท่านี้ก็เรียบร้อย เรียกใช้โปรเจ็กต์และเล่นเกม เมื่อโฆษณาที่มีการให้รางวัลโหลดขึ้นมาแล้ว คุณจะเห็นปุ่มคำแนะนำที่ด้านล่างของหน้าจอ คลิกปุ่มคำแนะนำเพื่อรับคำแนะนำเพิ่มเติม

4a114d243ae3e71d.gif

10. เสร็จเรียบร้อย

คุณทำ Codelab เสร็จสมบูรณ์แล้ว คุณดูโค้ดที่เสร็จสมบูรณ์ของ Codelab นี้ได้ในโฟลเดอร์ android_studio_folder.pngcomplete

ดู Codelab เกี่ยวกับการเพิ่มแบนเนอร์ AdMob และโฆษณาเนทีฟแบบอินไลน์ลงในแอป Flutter เพื่อดูวิธีติดตั้งโฆษณาแบนเนอร์และโฆษณาเนทีฟแบบอินไลน์

ลองดูข้อมูลเพิ่มเติมที่ Flutter Codelab