HarmonyOS 鸿蒙Next中应用闪屏页如何实现广告接入?

HarmonyOS 鸿蒙Next中应用闪屏页如何实现广告接入? 应用闪屏页如何实现广告接入?

5 回复

场景介绍

闪屏页广告接入是各类应用中的高频使用场景之一,如用户打开应用时加载广告界面。

本示例在应用启动闪屏页接入广告,支持点击广告跳转第三方应用,或点击"跳过"进入应用主页面。

效果预览

preview

实现思路

  1. 应用启动,在闪屏页aboutToAppear生命周期函数中调用loadAd加载广告。
aboutToAppear() {
  window.getLastWindow(this.context, (err: BusinessError, win: window.Window) => {
    // 开启全屏模式沉浸页面
    win.setWindowLayoutFullScreen(true);
    // 设置屏幕方向为竖屏
    win.setPreferredOrientation(window.Orientation.PORTRAIT);
  });
  // 调用loadAd加载广告
  let isFullScreen = PreferencesUtil.getSync('isFullScreen', false) as boolean;
  let adId = isFullScreen ? VIDEO_TEST_AD_ID : IMAGE_TEST_AD_ID;
  this.loadAd(adId)
}
  1. 广告加载成功后,闪屏页展示广告内容。
AdComponent({
  ads: [this.ad!],
  displayOptions: this.adDisplayOptions,
  interactionListener: {
    onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
      switch (status) {
        case AdStatus.AD_OPEN:
          break;
        case AdStatus.AD_CLICKED:
          break;
        case AdStatus.AD_CLOSED:
          RouterManager.routeToHome();
          break;
      }
    }
  }
})

完整代码:

代码地址:链接

import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';
import { advertising } from '@kit.AdsKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { RouterManager } from '../router/RouterManager';
import { AdView } from '../view/AdView';
import { PreferencesUtil } from '../utils/PreferencesUtil';

// 'testd7c5cewoj6'、'testq6zq98hecj'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
const VIDEO_TEST_AD_ID = 'testd7c5cewoj6';
const IMAGE_TEST_AD_ID = 'testq6zq98hecj';

@Entry
@Component
struct Index {
  @State ad: advertising.Advertisement | undefined = undefined;
  private uiContext: UIContext = this.getUIContext();
  private context: common.UIAbilityContext = this.uiContext.getHostContext() as common.UIAbilityContext;
  // 是否超时
  private isTimeOut: boolean = false;
  // 超时时间(单位毫秒),开发者可根据实际情况修改
  private timeOutDuration: number = 2000;
  // 超时index
  private timeOutIndex: number = -1;

  aboutToAppear() {
    window.getLastWindow(this.context, (err: BusinessError, win: window.Window) => {
      // 开启全屏模式沉浸页面
      win.setWindowLayoutFullScreen(true);
      // 设置屏幕方向为竖屏
      win.setPreferredOrientation(window.Orientation.PORTRAIT);
    });
    // 调用loadAd加载广告
    let isFullScreen = PreferencesUtil.getSync('isFullScreen', false) as boolean;
    let adId = isFullScreen ? VIDEO_TEST_AD_ID : IMAGE_TEST_AD_ID;
    this.loadAd(adId);
  }

  aboutToDisappear(): void {
    window.getLastWindow(this.context, (err: BusinessError, win: window.Window) => {
      // 关闭全屏模式,开发者可根据实际情况修改
      win.setWindowLayoutFullScreen(false);
      // 设置屏幕方向为默认值,开发者可根据实际情况修改
      win.setPreferredOrientation(window.Orientation.UNSPECIFIED);
    });
  }

  build() {
    RelativeContainer() {
      // Slogan 图片
      Image($r('app.media.slogan'))
        .width('100%')
        .height('90%');
      // 展示媒体自定义icon、应用名称、版权信息
      Column() {
        Row() {
          Image($r('app.media.startIcon'))
            .width(20)
            .height(20)
            .margin(8);
          Text($r('app.string.app_name'))
            .fontColor('#1A1A1A')
            .fontSize(16);
        };
      }
      .alignItems(HorizontalAlign.Center)
      .justifyContent(FlexAlign.Center)
      .alignRules({ bottom: { anchor: '__container__', align: VerticalAlign.Bottom } })
      .width('100%')
      .height('10%');

      AdView({ ad: this.ad });
    }
    .width('100%')
    .height('100%');
  }

  // 请求广告
  private async loadAd(adId: string): Promise<void> {
    // 广告请求参数
    const adRequestParams: advertising.AdRequestParams = {
      // 广告位ID
      adId: adId,
      // 开屏广告类型
      adType: 1,
      // 请求的广告数量
      adCount: 1,
      // 开放匿名设备标识符
      oaid: ''
    };
    // 广告配置参数
    const adOptions: advertising.AdOptions = {
      // 是否允许流量下载 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 adLoadListener: advertising.AdLoadListener = {
      // 广告请求失败回调
      onAdLoadFailure: (errorCode: number, errorMsg: string) => {
        hilog.error(0x0000, 'testTag', `Failed to load ad. Code is ${errorCode}, message is ${errorMsg}`);
      },
      // 广告请求成功回调
      onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
        clearTimeout(this.timeOutIndex);
        if (this.isTimeOut) {
          return;
        }
        hilog.info(0x0000, 'testTag', 'Succeeded in loading ad');
        this.ad = ads[0];
      }
    };
    // 创建AdLoader广告对象
    const adLoader: advertising.AdLoader = new advertising.AdLoader(this.context);
    this.timeOutHandler();
    // 调用广告请求接口
    adLoader.loadAd(adRequestParams, adOptions, adLoadListener);
  }

  private timeOutHandler(): void {
    this.isTimeOut = false;
    // 超时处理
    this.timeOutIndex = setTimeout(() => {
      this.isTimeOut = true;
      RouterManager.routeToHome(this.uiContext);
      hilog.error(0x0000, 'testTag', 'Load ad time out');
    }, this.timeOutDuration);
  }
}

更多关于HarmonyOS 鸿蒙Next中应用闪屏页如何实现广告接入?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


有没有开发手册啊,这广告位ID是哪来的?

在HarmonyOS Next中实现应用闪屏页广告接入,需使用ArkTS声明式开发。通过SplashScreen组件管理闪屏生命周期,结合广告SDK的初始化方法加载广告资源。利用UI组件展示广告内容,并通过事件回调处理广告点击与关闭逻辑。确保广告展示时长符合平台规范,同时通过生命周期回调控制广告与主界面的无缝切换。具体实现需参考HarmonyOS广告接口文档。

在HarmonyOS Next中实现应用闪屏页广告接入,建议采用以下方案:

  1. 广告SDK集成
    接入华为广告服务(HUAWEI Ads Kit),在entry模块的build.gradle中添加依赖:

    implementation 'com.huawei.hms:ads:13.4.xx.xxx'
    
  2. 闪屏页布局设计
    xml中定义广告视图容器:

    <com.huawei.hms.ads.nativead.NativeView
        ohos:id="$+id:splash_ad_container"
        ... />
    
  3. 广告加载逻辑
    在Ability的onStart()中初始化广告:

    NativeAdLoader loader = new NativeAdLoader(context);
    loader.loadAd(new AdParam.Builder().build(), 
        new NativeAdLoadListener() {
            @Override
            public void onNativeAdLoaded(NativeAd nativeAd) {
                // 渲染广告到NativeView
            }
        });
    
  4. 生命周期控制
    设置3-5秒展示时长,使用EventHandler延时跳转主页面。注意在onBackPressed()中禁用返回键。

  5. 合规要求

    • 需提供明确的"跳过"按钮
    • 广告关闭后立即进入主界面
    • 遵循《华为广告规范》中的闪屏广告设计准则

建议通过NativeAd类型实现静态/动态广告素材的适配,同时注意网络异常时的超时处理机制。

回到顶部