Flutter集成Unity Ads广告插件google_applovin_unity_ads的使用

Flutter集成Unity Ads广告插件google_applovin_unity_ads的使用

添加依赖到pubspec.yaml

dependencies:
  google_applovin_unity_ads: ^2.3.42
  get:
  flutter_screenutil:
  visibility_detector: ^0.3.3

在AndroidManifest.xml中添加权限和配置

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

<application
  ...
  <meta-data
    android:name="com.google.android.gms.ads.AD_MANAGER_APP"
    android:value="true" />

  <meta-data
    android:name="com.google.android.gms.ads.APPLICATION_ID"
    android:value="YOUR_ADMOB_APPLICATION_ID" />

  <!-- 对于Android启动屏 -->
  <meta-data
    android:name="io.flutter.embedding.android.SplashScreenDrawable"
    android:resource="@drawable/launch_background" />
  ...
</application>

在build.gradle中添加配置

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 20
    targetSdkVersion 33
    multiDexEnabled true
  }
  ...
}

初始化Flutter应用

import 'package:flutter/material.dart';
import 'package:get/route_manager.dart';
import 'package:google_applovin_unity_ads/google_applovin_unity_ads.dart';
import 'package:google_applovin_unity_ads_example/main_screen.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  MobileAds.instance.initialize();
  FacebookAds.instance.initialize();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final String placeholderText = 'Lorem ipsum dolor sit amet';

  Widget _nativeAd = Container(height: 0);
  Widget _bannerAd = Container(height: 0);

  @override
  void initState() {
    super.initState();
    Future.delayed(
      const Duration(seconds: 1),
      () => {
        fetchAdsSettings(
          appVersionCode: 1,
          settingsUrl: "YOUR_SETTINGS_URL",
          keyName: "YOUR_KEY_NAME",
        ).then((value) => {
          getAdsSettings()?.adsSequence?.clear(),
          getAdsSettings()?.intraAdsSequence?.clear(),
          getAdsSettings()?.bannerAdsSequence?.clear(),
          getAdsSettings()?.openAdsSequence?.clear(),
          getAdsSettings()?.rewardsAdsSequence?.clear(),
          getAdsSettings()?.adsSequence?.add("app_lovin"),
          getAdsSettings()?.intraAdsSequence?.add("app_lovin"),
          getAdsSettings()?.rewardsAdsSequence?.add("app_lovin"),
          getAdsSettings()?.openAdsSequence?.add("app_lovin"),
          if ((getAdsSettings()?.appLovin?.sdkKey ?? "").isNotEmpty) {
            AppLovinAds.instance
                .initialize(
                  getAdsSettings()?.appLovin?.sdkKey ?? "",
                  getAdsSettings()?.adSetting?.isGeoedgeSdkFlag == true
                      ? (getAdsSettings()?.adSetting?.geoedgeSdkKey ?? "")
                      : "",
                  getAdsSettings()?.adSetting?.isGeoedgeSdkFlag == true
                      ? (getAdsSettings()?.adSetting?.geoedgeSdkKeyTimeoutInSeconds ?? 0)
                      : 0,
                )
                .then((value) => {
                      loadIntraAds(),
                      loadRewardAds(),
                      showMediumNativeAds(
                        customOptions: {
                          "btn_colors": ["#00F0F0"],
                          "btn_corner_radius": 18.5,
                          "btn_text_color": "#8bc34ae0",
                          "btn_gradient_orientation": GradientOrientation.TOP_BOTTOM.index,
                          "text_heading_colors": "#8bc34ae0",
                          "text_body_colors": "#8bc34ae0",
                          "text_store_colors": "#8bc34ae0",
                          "text_fonts": "mooli_regular.ttf",
                        },
                        onAdLoadedCallback: (p0) {
                          setState(() {
                            _nativeAd = p0;
                          });
                        },
                      ),
                      showBannerAds(
                        margin: const EdgeInsets.symmetric(vertical: 24),
                        onAdLoadedCallback: (p0) {
                          setState(() {
                            _bannerAd = p0;
                          });
                        },
                      ),
                    })
          },
          initOpenAds(
            context: Get.context!,
            onOpenAdLoaded: () {
              showOpenAds(Get.context!);
            }
          )
        })
      }
    );
  }

  @override
  void dispose() {
    super.dispose();
    destroyAd();
  }

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: Builder(builder: (BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Ads example app'),
            actions: <Widget>[
              PopupMenuButton<String>(
                onSelected: (String result) {
                  switch (result) {
                    case 'InterstitialAd':
                      showIntraAds(
                        context: context,
                        callback: () => {print("showIntraAds Is Completed")},
                      );
                      break;
                    case 'RewardedAd':
                      showRewardAds(
                        context: context,
                        callback: () => {print("Show Completed true")},
                        onSkippedCallback: () => {print("Skipped Ad true")},
                        onFailedCallback: () => {
                          showIntraAds(
                            context: context,
                            isCompulsory: true,
                            callback: () => {print("Show Completed onFailedCallback")},
                          )
                        },
                      );
                      break;
                    case 'MainScreen':
                      Navigator.push(context, MaterialPageRoute(
                        builder: (context) {
                          return const MainScreen();
                        },
                      ));
                      break;
                    default:
                      throw AssertionError('unexpected button: $result');
                  }
                },
                itemBuilder: (BuildContext context) => <PopupMenuEntry<String>>[
                  const PopupMenuItem<String>(
                    value: 'InterstitialAd',
                    child: Text('InterstitialAd'),
                  ),
                  const PopupMenuItem<String>(
                    value: 'RewardedAd',
                    child: Text('RewardedAd'),
                  ),
                  const PopupMenuItem<String>(
                    value: 'MainScreen',
                    child: Text('MainScreen'),
                  )
                ],
              ),
            ],
          ),
          body: SafeArea(
            child: SingleChildScrollView(
              child: Column(children: [
                _nativeAd,
                const SizedBox(height: 20),
                Text(placeholderText),
                const SizedBox(height: 20),
                TextButton(
                  style: ButtonStyle(
                    overlayColor: MaterialStateProperty.resolveWith<Color?>(
                        (Set<MaterialState> states) {
                      if (states.contains(MaterialState.focused))
                        return Colors.red;
                      return null; // Defer to the widget's default.
                    }),
                  ),
                  onPressed: () {
                    showIntraAds(context: context, callback: () {});
                  },
                  child: const Text('INTRA ADS'),
                ),
                const SizedBox(height: 20),
                TextButton(
                  style: ButtonStyle(
                    overlayColor: MaterialStateProperty.resolveWith<Color?>(
                        (Set<MaterialState> states) {
                      if (states.contains(MaterialState.focused)) {
                        return Colors.red;
                      }
                      return null; // Defer to the widget's default.
                    }),
                  ),
                  onPressed: () {
                    initOpenAds(
                      context: Get.context!,
                      onOpenAdLoaded: () {
                        showOpenAds(Get.context!);
                      },
                    );
                  },
                  child: const Text('REWARD ADS'),
                )
              ]),
            ),
          ),
          bottomNavigationBar: _bannerAd,
        );
      }),
    );
  }
}

在MainActivity.kt中添加自定义原生广告工厂

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import com.btcpiyush.ads.google_applovin_unity_ads.CustomNativeAd
import com.btcpiyush.ads.google_applovin_unity_ads.GoogleApplovinUnityAdsPlugin

class MainActivity: FlutterActivity() {
  override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)
    val factory: CustomNativeAd = CustomNativeAd(getLayoutInflater())
    GoogleApplovinUnityAdsPlugin.registerNativeAdFactory(flutterEngine, "nativeFactoryId", factory)
  }

  override fun cleanUpFlutterEngine(flutterEngine: FlutterEngine) {
    GoogleApplovinUnityAdsPlugin.unregisterNativeAdFactory(flutterEngine, "nativeFactoryId")
  }
}

小型原生广告示例

Widget smallNativeShow = Container(height: 0);

// 加载原生广告
showMediumNativeAds(
  onAdLoadedCallback: (a) => {
    setState(() {
      smallNativeShow = a;
    })
  },
);

// 显示原生广告
smallNativeShow,

大型原生广告示例

Widget bigNativeShow = Container(height: 0);

// 加载原生广告
showNativeAds(
  onAdLoadedCallback: (a) => {
    setState(() {
      bigNativeShow = a;
    })
  },
);

// 显示原生广告
bigNativeShow,

更多关于Flutter集成Unity Ads广告插件google_applovin_unity_ads的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Unity Ads广告插件google_applovin_unity_ads的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成Unity Ads广告插件 google_applovin_unity_ads 可以让你在应用中展示Unity Ads广告。以下是如何在Flutter项目中集成和使用该插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 google_applovin_unity_ads 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  google_applovin_unity_ads: ^latest_version

替换 latest_version 为最新的插件版本号。你可以访问 pub.dev 获取最新版本。

2. 配置Unity Ads

在你的Unity Ads开发者控制台中创建一个应用,并获取 Game ID。你需要在代码中配置这个 Game ID

3. 初始化插件

在你的Flutter应用启动时,初始化Unity Ads插件。通常可以在 main.dart 文件的 main 函数中进行初始化。

import 'package:flutter/material.dart';
import 'package:google_applovin_unity_ads/google_applovin_unity_ads.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化Unity Ads
  await UnityAds.initialize(
    gameId: 'YOUR_GAME_ID', // 替换为你的Unity Ads Game ID
    testMode: true, // 测试模式,发布时设置为false
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Unity Ads Example',
      home: HomeScreen(),
    );
  }
}

4. 展示广告

你可以使用 UnityAds.showInterstitialAdUnityAds.showRewardedAd 方法来展示插页广告或激励广告。

展示插页广告

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Unity Ads Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 展示插页广告
            await UnityAds.showInterstitialAd(
              placementId: 'YOUR_INTERSTITIAL_PLACEMENT_ID', // 替换为你的插页广告位ID
            );
          },
          child: Text('Show Interstitial Ad'),
        ),
      ),
    );
  }
}

展示激励广告

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Unity Ads Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 展示激励广告
            await UnityAds.showRewardedAd(
              placementId: 'YOUR_REWARDED_PLACEMENT_ID', // 替换为你的激励广告位ID
              onRewarded: (reward) {
                // 用户观看完广告后的回调
                print('User earned reward: ${reward.amount} ${reward.type}');
              },
            );
          },
          child: Text('Show Rewarded Ad'),
        ),
      ),
    );
  }
}

5. 处理广告事件

你可以监听Unity Ads的各种事件,比如广告加载成功、广告展示成功、广告关闭等。

UnityAds.setListener(UnityAdsListener(
  onReady: (placementId) {
    print('Ad is ready to show for placement: $placementId');
  },
  onStart: (placementId) {
    print('Ad started for placement: $placementId');
  },
  onClick: (placementId) {
    print('Ad clicked for placement: $placementId');
  },
  onFailed: (placementId, error, message) {
    print('Ad failed to show for placement: $placementId with error: $message');
  },
  onCompleted: (placementId) {
    print('Ad completed for placement: $placementId');
  },
  onSkipped: (placementId) {
    print('Ad skipped for placement: $placementId');
  },
));
回到顶部