HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告

Flutter鸿蒙开发接入鲸鸿动能 - 激励广告

在本文中,我们将讲解如何在Flutter应用中接入鸿蒙的鲸鸿动能广告系统,重点介绍如何调用激励广告。如果您对Flutter与原生ArkTS交互还不了解,请先阅读:Flutter与原生ArkTS交互实现

激励广告仅做基础本地验证。如需服务器端验证,请根据自身需求编写后端代码。

实现步骤

1. 编写原生端代码

获取OAID

在之前的接入开屏广告文章中,我们已经讲解了获取OAID的方法,可以复用相关代码。

请求激励广告

以下是请求激励广告的代码实现:

function requestIncentiveAdvertising(adLoader: advertising.AdLoader,context: common.UIAbilityContext,oaid:string,result:MethodResult): void {
  const adRequestParam: advertising.AdRequestParams = {
    // 广告类型:7激励广告
    adType: 7,
    // 'testx9dtjwj8hp'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
    adId: 'testx9dtjwj8hp',
    oaid: oaid
  };
  const adOption: advertising.AdOptions = {
    // 设置是否请求非个性化广告
    nonPersonalizedAd: 0,
    // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
    allowMobileTraffic: 1,
    // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
    tagForChildProtection: -1,
    // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
    tagForUnderAgeOfPromise: -1,
    // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
    adContentClassification: 'A'
  };
  const adLoaderListener: advertising.AdLoadListener = {
    onAdLoadFailure: (errorCode: number, errorMsg: string) => {
      hilog.error(0x0000, 'testTag', '%{public}s',
        `Failed to request ad, message: ${errorMsg}, error code: ${errorCode}`);
      result.success("error:"+errorCode+" - "+errorMsg)
    },
    onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
      hilog.info(0x0000, 'testTag', '%{public}s', `Succeeded in requesting ad`);
      showAd(context,ads,result)
    },
  };
  adLoader.loadAd(adRequestParam, adOption, adLoaderListener);
}

根据需要自行调整配置

展示激励广告

function showAd(context: common.UIAbilityContext,ads:Array<advertising.Advertisement>,result:MethodResult) {
  new RewardAdStatusHandler().registerPPSReceiver(result)
  let load: advertising.AdLoader = new advertising.AdLoader(context);
  const displayOptions: advertising.AdDisplayOptions = {
    // 激励广告视频播放是否静音
    mute: true
  };
  advertising.showAd(ads[0], displayOptions, context);
}

2. 创建事件Handler

为了验证激励广告是否完整观看,需要创建一个Handler对事件进行订阅。

import { commonEventManager, BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { MethodResult } from '@ohos/flutter_ohos';

const KEY_REWARD_DATA = "reward_ad_data";
const KEY_REWARD_STATUS = "reward_ad_status";

export class RewardAdStatusHandler {
  // 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
  private subscriber: commonEventManager.CommonEventSubscriber | null = null;

  // 订阅方法,需要在每次展示广告前调用
  public registerPPSReceiver(result:MethodResult): void {
    if (this.subscriber) {
      this.unRegisterPPSReceiver();
    }
    // 订阅者信息
    const subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
      events: ['com.huawei.hms.pps.action.PPS_REWARD_STATUS_CHANGED'],
      // publisherBundleName被设置为"com.huawei.hms.adsservice",这意味着只有来自该包名的事件才会被订阅者接受和处理。
      // 如果没有明确声明publisherBundleName,那么订阅者可能会收到来自其它包名的伪造事件,从而导致安全性问题或误导。
      publisherBundleName: 'com.huawei.hms.adsservice'
    };
    // 创建订阅者回调
    commonEventManager.createSubscriber(subscribeInfo, (err: BusinessError, commonEventSubscriber:
      commonEventManager.CommonEventSubscriber) => {
      if (err) {

        hilog.error(0x0000, 'testTag', '%{public}s',
          `createSubscriber error, code: ${err.code}, message: ${err.message}`);
        return;
      }
      hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in creating subscriber');
      this.subscriber = commonEventSubscriber;
      // 订阅公共事件回调
      if (!this.subscriber) {
        hilog.warn(0x0000, 'testTag', '%{public}s', 'Need create subscriber');
        return;
      }

      commonEventManager.subscribe(this.subscriber, (err: BusinessError, commonEventSubscriber:
        commonEventManager.CommonEventData) => {
        if (err) {
          hilog.error(0x0000, 'testTag', '%{public}s', `Subscribe error, code: ${err.code}, message: ${err.message}`);
          result.success("error")
        } else {
          hilog.info(0x0000, 'testTag', '%{public}s', 'Subscribe data');
          const status: string = commonEventSubscriber?.parameters?.[KEY_REWARD_STATUS];
          switch (status) {
            case AdStatus.AD_OPEN:
              hilog.info(0x0000, 'testTag', '%{public}s', 'onAdOpen');
              break;

            case AdStatus.AD_CLICKED:
              hilog.info(0x0000, 'testTag', '%{public}s', 'onAdClick');
              break;
            case AdStatus.AD_CLOSED:
              hilog.info(0x0000, 'testTag', '%{public}s', 'onAdClose');
              result.success(AdStatus.AD_CLOSED)
              this.unRegisterPPSReceiver();
              break;
            case AdStatus.AD_REWARDED:
              const rewardData: Record<string, string | number> = commonEventSubscriber?.parameters?.[KEY_REWARD_DATA];
              const rewardType: string = rewardData?.rewardType as string;
              const rewardAmount: number = rewardData?.rewardAmount as number;
              hilog.info(0x0000, 'testTag', '%{public}s',
                `onAdReward, rewardType: ${rewardType}, rewardAmount: ${rewardAmount}`);
              this.unRegisterPPSReceiver();
              result.success(AdStatus.AD_REWARDED)
              break;
            case AdStatus.AD_VIDEO_START:
              hilog.info(0x0000, 'testTag', '%{public}s', 'onAdVideoStart');
              break;
            case AdStatus.AD_COMPLETED:
              hilog.info(0x0000, 'testTag', '%{public}s', 'onAdCompleted');
              break;
            default:
              break;
          }
        }
      });
    });
  }

  // 取消订阅
  public unRegisterPPSReceiver(): void {
    commonEventManager.unsubscribe(this.subscriber, (err: BusinessError) => {
      if (err) {
        hilog.error(0x0000, 'testTag', '%{public}s', `Unsubscribe error, code: ${err.code}, message: ${err.message}`);
      } else {
        hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in unsubscribing');
        this.subscriber = null;
      }
    });
  }
}

enum AdStatus {
  AD_OPEN = 'onAdOpen',
  AD_CLICKED = 'onAdClick',
  AD_CLOSED = 'onAdClose',
  AD_REWARDED = 'onAdReward',
  AD_VIDEO_START = 'onVideoPlayBegin',
  AD_COMPLETED = 'onVideoPlayEnd'
}

我在此处将MethodResult进行了传入,并只在AD_CLOSED和AD_REWARDED上做了响应。因为如果激励视频的奖励时间达标,result只能返回一次信息,AD_REWARDED一定先于AD_CLOSED完成返回响应,否则就是用户提前关闭了激励视频。 也可以根据自己的需要,在其他事件上添加处理

3. 展示开屏广告

添加MethodChannelHandler

if(call.method=="showIncentiveAdvertising"){
  let load: advertising.AdLoader = new advertising.AdLoader(this.context);
  requestIncentiveAdvertising(load,this.context,oaid,result);
}

flutter调用激励广告

static Future<int> showRewardAd() async {
  try {
    final result = await platform.invokeMethod('showIncentiveAdvertising');
    if (result.toString().contains('onAdReward')) {
      return 1;
    } else if (result.toString().contains('error')) {
      return -1;
    }
    return 0;
  } on PlatformException catch (e) {
    print("Failed to show reward ad: '${e.message}'.");
    return 0;
  }
}

调用时,await会阻塞Flutter端后续代码。如果广告请求失败,将返回-1,开发者可提示用户“暂时没有广告可看”。

如果广告正常展示,用户完整观看广告会返回1,此时即可执行奖励逻辑;若用户提前关闭广告,将返回0


至此,激励广告接入流程完成。开发者可根据业务需求进一步优化相关逻辑。


更多关于HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

2 回复

在HarmonyOS鸿蒙Next中,Flutter开发接入鲸鸿动能激励广告的步骤如下:

  1. 环境准备:确保开发环境已安装Flutter SDK,并配置好HarmonyOS开发环境。

  2. 集成鲸鸿动能SDK:在Flutter项目的pubspec.yaml文件中添加鲸鸿动能SDK依赖。例如:

    dependencies:
      huawei_ads: ^x.x.x

    然后运行flutter pub get安装依赖。

  3. 初始化SDK:在Flutter应用的main.dart文件中初始化鲸鸿动能SDK。例如:

    import 'package:huawei_ads/huawei_ads.dart';
    
    void main() {
      Ads.instance.init();
      runApp(MyApp());
    }
  4. 创建激励广告实例:在需要展示激励广告的页面中,创建激励广告实例。例如:

    RewardedAd rewardedAd = RewardedAd(
      adUnitId: 'your_ad_unit_id',
      listener: AdListener(
        onAdLoaded: () {
          // 广告加载成功
        },
        onAdFailedToLoad: (int errorCode) {
          // 广告加载失败
        },
        onAdOpened: () {
          // 广告打开
        },
        onAdClosed: () {
          // 广告关闭
        },
        onRewarded: (RewardItem reward) {
          // 用户获得奖励
        },
      ),
    );
  5. 加载和展示广告:调用load方法加载广告,并在合适的时机调用show方法展示广告。例如:

    rewardedAd.load();
    rewardedAd.show();
  6. 处理广告生命周期:在页面销毁时,释放广告资源。例如:

    [@override](/user/override)
    void dispose() {
      rewardedAd.dispose();
      super.dispose();
    }

通过以上步骤,可以在HarmonyOS鸿蒙Next的Flutter应用中成功接入鲸鸿动能激励广告。

更多关于HarmonyOS鸿蒙Next中Flutter开发接入鲸鸿动能-激励广告的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在HarmonyOS鸿蒙Next中接入鲸鸿动能的激励广告,首先需要在Flutter项目中集成鲸鸿动能的SDK。通过pubspec.yaml文件添加依赖,然后在代码中初始化SDK并配置广告位ID。使用RewardedAd类加载和展示激励广告,监听广告事件如加载完成、展示成功和用户奖励等。确保在广告展示后处理用户奖励逻辑,以提升用户体验。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!