HarmonyOS NEXT应用开发,接入广告云云简单(避坑指南)

打印 上一主题 下一主题

主题 1847|帖子 1847|积分 5551

广告的使用,本该是挺简单的。只是初次打仗时,有点懵,不知道怎么用。实在记住两点就行了,一个是广告请求,可以看做是给你提供好了API接口,按照规范传参就行了。一个是广告展示,不同类型广告对应的有组件可用。最后,至于布局嘛,则跟其他平凡组件类似。记住这些就已经掌握了广告。
  本文先对广告服务就行先容 ,后续对广告接口举行一层封装,便于使用。
避坑指南:
1.模仿器中不支持广告。别纠结于为啥白屏。
2.测试广告位不稳固,别纠结于真机有时候也总返回 21800003
Failed to request ad, code is: 21800003errorMsg is: Failed to load the ad request
测试发起:先在真机跑跑demo,先看看官方的测试广告位是否正常。
广告服务(Ads Kit)先容

Ads Kit(广告服务)依托华为终端平台与数据能力为您提供流量变现服务,帮助您解决流量变现的困难;同时为广告主提供广告服务,配合华为终端平台向用户提供个性化的营销活动或贸易广告。
鲸鸿动能流量变现服务(以下简称流量变现服务)是广告服务依托华为终端强大的平台与数据能力为您提供的App流量变现服务,您通过该服务可以在自己的App中获取并向用户展示精美的、高价值的广告内容,并从中获得广告收益。
为满意App不同场景下的内容形式,流量变现服务为您提供了横幅广告、原生广告、激励广告、插屏广告、开屏广告、贴片广告六种广告形式。
Ads Kit提供广告标识符和转化跟踪能力,方便广告平台和广告主举行个性化广告投放和广告转化渠道跟踪。
开放匿名设备标识符(Open Anonymous Device Identifier, OAID,以下简称OAID):是一种非永久性设备标识符,基于开放匿名设备标识符,可在掩护用户个人数据隐私安全的前提下,向用户提供个性化广告,同时三方监测平台也可以向广告主提供转化归因分析。

广告类型

横幅广告 

场景先容

横幅广告又名Banner广告,是在应用程序顶部、中部或底部占据一个位置的矩形图片,广告内容每隔一段时间会自动刷新。

基本使用

  1. import { advertising, AutoAdComponent, identifier } from '@kit.AdsKit';
  2. import { hilog } from '@kit.PerformanceAnalysisKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. @Entry
  5. @Component
  6. struct Index {
  7.   @State adParam: advertising.AdRequestParams = {
  8.     // 广告类型:横幅广告
  9.     adType: 8,
  10.     // 'testw6vs28auh3'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
  11.     adId: 'testw6vs28auh3',
  12.     // 广告位宽
  13.     adWidth: 360,
  14.     // 广告位高
  15.     adHeight: 57,
  16.     // 开放匿名设备标识符
  17.     oaid: ''
  18.   };
  19.   private adOptions: advertising.AdOptions = {
  20.     // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
  21.     allowMobileTraffic: 0,
  22.     // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
  23.     tagForChildProtection: -1,
  24.     // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
  25.     tagForUnderAgeOfPromise: -1,
  26.     // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
  27.     adContentClassification: 'A'
  28.   };
  29.   private displayOptions: advertising.AdDisplayOptions = {
  30.     // 广告轮播的时间间隔,单位ms,取值范围[30000, 120000]
  31.     refreshTime: 30000
  32.   }
  33.   private ratio: number = 1;
  34.   private adWidth: number = -1;
  35.   private adHeight: number = -1;
  36.   @State visibilityState: Visibility = Visibility.Visible;
  37.   aboutToAppear() {
  38.     try {
  39.       // 使用Promise回调方式获取OAID
  40.       identifier.getOAID().then((data) => {
  41.         this.adParam.oaid = data;
  42.         hilog.info(0x0000, 'testTag', '%{public}s', `Succeeded in getting adsIdentifierInfo by promise`);
  43.       }).catch((error: BusinessError) => {
  44.         hilog.error(0x0000, 'testTag', '%{public}s',
  45.           `Failed to get adsIdentifierInfo, code: ${error.code}, message: ${error.message}`);
  46.       })
  47.     } catch (error) {
  48.       hilog.error(0x0000, 'testTag', '%{public}s', `Catch err, code: ${error.code}, message: ${error.message}`);
  49.     }
  50.     if (this.adParam?.adWidth && typeof (this.adParam?.adWidth) === 'number' && this.adParam?.adWidth > 0) {
  51.       this.adWidth = this.adParam?.adWidth;
  52.     }
  53.     if (this.adParam?.adHeight && typeof (this.adParam?.adHeight) === 'number' && this.adParam?.adHeight > 0) {
  54.       this.adHeight = this.adParam?.adHeight;
  55.     }
  56.     if (this.adWidth > 0 && this.adHeight > 0) {
  57.       this.ratio = this.adWidth / this.adHeight;
  58.     }
  59.   }
  60.   build() {
  61.     if (this.adParam.oaid) {
  62.       Stack({ alignContent: Alignment.Bottom }) {
  63.         this.buildBannerView()
  64.       }
  65.     }
  66.   }
  67.   @Builder
  68.   buildBannerView() {
  69.     Row() {
  70.       AutoAdComponent({
  71.         adParam: this.adParam,
  72.         adOptions: this.adOptions,
  73.         displayOptions: this.displayOptions,
  74.         interactionListener: {
  75.           onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
  76.             hilog.info(0x0000, 'testTag', '%{public}s', `status is ${status}`);
  77.             switch (status) {
  78.               case AdStatus.AD_OPEN:
  79.                 hilog.info(0x0000, 'testTag', '%{public}s', 'Status is onAdOpen');
  80.                 break;
  81.               case AdStatus.AD_CLICKED:
  82.                 hilog.info(0x0000, 'testTag', '%{public}s', 'Status is onAdClick');
  83.                 break;
  84.               case AdStatus.AD_CLOSED:
  85.                 hilog.info(0x0000, 'testTag', '%{public}s', 'Status is onAdClose');
  86.                 this.visibilityState = Visibility.None;
  87.                 break;
  88.               case AdStatus.AD_LOAD:
  89.                 hilog.info(0x0000, 'testTag', '%{public}s', 'Status is onAdLoad');
  90.                 break;
  91.               case AdStatus.AD_FAIL:
  92.                 hilog.error(0x0000, 'testTag', '%{public}s', 'Status is onAdFail');
  93.                 this.visibilityState = Visibility.None;
  94.                 break;
  95.             }
  96.           }
  97.         }
  98.       })
  99.     }
  100.     .width('100%')
  101.     .aspectRatio(this.ratio)
  102.     .visibility(this.visibilityState)
  103.   }
  104. }
  105. enum AdStatus {
  106.   AD_LOAD = 'onAdLoad',
  107.   AD_FAIL = 'onAdFail',
  108.   AD_OPEN = 'onAdOpen',
  109.   AD_CLICKED = 'onAdClick',
  110.   AD_CLOSED = 'onAdClose',
  111.   AD_REWARDED = 'onAdReward',
  112.   AD_VIDEO_START = 'onVideoPlayBegin',
  113.   AD_COMPLETED = 'onVideoPlayEnd'
  114. }
复制代码
原生广告

场景先容

原生广告是与应用内容融于一体的广告,通过“和谐”的内容出现广告信息,在不破坏用户体验的前提下,为用户提供有价值的信息,展示形式包含图片和视频,支持您自由定制界面。

简单使用

 广告请求:
广告展示:
  1. import { advertising, identifier } from '@kit.AdsKit';
  2. import { router } from '@kit.ArkUI';
  3. import { common } from '@kit.AbilityKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. import { BusinessError } from '@kit.BasicServicesKit';
  6. @Entry
  7. @Component
  8. export struct LoadAd {
  9.   private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  10.   private oaid: string = '';
  11.   aboutToAppear() {
  12.     try {
  13.       // 使用Promise回调方式获取OAID
  14.       identifier.getOAID().then((data: string) => {
  15.         this.oaid = data;
  16.         hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in getting adsIdentifierInfo by promise');
  17.       }).catch((error: BusinessError) => {
  18.         hilog.error(0x0000, 'testTag', '%{public}s',
  19.           `Failed to get adsIdentifierInfo, error code: ${error.code}, message: ${error.message}`);
  20.       })
  21.     } catch (error) {
  22.       hilog.error(0x0000, 'testTag', '%{public}s', `Catch err, code: ${error.code}, message: ${error.message}`);
  23.     }
  24.   }
  25.   build() {
  26.     Column() {
  27.       Column() {
  28.         // 跳转到原生广告展示页面
  29.         Button("请求原生广告", { type: ButtonType.Normal, stateEffect: true }).onClick(() => {
  30.           this.requestAd();
  31.         })
  32.       }.width('100%').height('80%').justifyContent(FlexAlign.Center)
  33.     }
  34.     .width('100%')
  35.     .height('100%')
  36.   }
  37.   private requestAd(): void {
  38.     // 广告展示参数
  39.     const adDisplayOptions: advertising.AdDisplayOptions = {
  40.       // 是否静音,默认不静音
  41.       mute: false
  42.     }
  43.     // 原生广告配置
  44.     const adOptions: advertising.AdOptions = {
  45.       // 设置是否请求非个性化广告
  46.       nonPersonalizedAd: 1,
  47.       // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
  48.       allowMobileTraffic: 0,
  49.       // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
  50.       tagForChildProtection: -1,
  51.       // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
  52.       tagForUnderAgeOfPromise: -1,
  53.       // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
  54.       adContentClassification: 'A'
  55.     }
  56.     // 原生广告请求参数
  57.     const nativeVideoAdReqParams: advertising.AdRequestParams = {
  58.       // 'testu7m3hc4gvm'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
  59.       adId: 'testu7m3hc4gvm',
  60.       adType: 3,
  61.       adCount: 1,
  62.       // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  63.       enableDirectReturnVideoAd: true,
  64.       oaid: this.oaid
  65.     }
  66.     // 广告请求回调监听
  67.     const adLoaderListener: advertising.AdLoadListener = {
  68.       // 广告请求失败回调
  69.       onAdLoadFailure: (errorCode: number, errorMsg: string) => {
  70.         hilog.error(0x0000, 'testTag', '%{public}s',
  71.           `Failed to request ad, message: ${errorMsg}, error code: ${errorCode}`);
  72.       },
  73.       // 广告请求成功回调
  74.       onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
  75.         hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in requesting ad');
  76.         // 调用原生广告展示页面
  77.         routePage('pages/NativeAdPage', ads, adDisplayOptions);
  78.       }
  79.     };
  80.     // 创建AdLoader广告对象
  81.     const load: advertising.AdLoader = new advertising.AdLoader(this.context);
  82.     // 调用广告请求接口
  83.     load.loadAd(nativeVideoAdReqParams, adOptions, adLoaderListener);
  84.   }
  85. }
  86. async function routePage(pageUri: string, ads: Array<advertising.Advertisement | null>,
  87.   displayOptions: advertising.AdDisplayOptions) {
  88.   let options: router.RouterOptions = {
  89.     url: pageUri,
  90.     params: {
  91.       ads: ads,
  92.       displayOptions: displayOptions
  93.     }
  94.   }
  95.   try {
  96.     router.pushUrl(options);
  97.   } catch (error) {
  98.     hilog.error(0x0000, 'testTag', '%{public}s',
  99.       `Failed to routePage callback, code: ${error.code}, msg: ${error.message}`);
  100.   }
  101. }
复制代码
  1. import { advertising, AdComponent } from '@kit.AdsKit';
  2. import { Prompt, router } from '@kit.ArkUI';
  3. @Entry
  4. @Component
  5. export struct NativeAdPage {
  6.   // 广告内容
  7.   private ads: Array<advertising.Advertisement> = [];
  8.   private adDisplayOptions: advertising.AdDisplayOptions = {
  9.     // 是否静音,默认不静音
  10.     mute: false
  11.   }
  12.   aboutToAppear() {
  13.     const params: Record<string, Object> = router.getParams() as Record<string, Object>;
  14.     if (params && params.ads as Array<advertising.Advertisement> &&
  15.       params.displayOptions as advertising.AdDisplayOptions) {
  16.       this.ads = params.ads as Array<advertising.Advertisement>;
  17.       this.adDisplayOptions = params.displayOptions as advertising.AdDisplayOptions;
  18.     }
  19.   }
  20.   build() {
  21.     Column() {
  22.       List({ space: 20, initialIndex: 0 }) {
  23.         ForEach(this.ads, (ad: advertising.Advertisement) => {
  24.           ListItem() {
  25.             AdComponent({
  26.               ads: [ad],
  27.               displayOptions: this.adDisplayOptions,
  28.               interactionListener: {
  29.                 onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
  30.                   switch (status) {
  31.                     case 'onAdOpen':
  32.                       Prompt.showToast({
  33.                         message: 'native ad open',
  34.                         duration: 1000
  35.                       });
  36.                       break;
  37.                     case 'onAdClick':
  38.                       Prompt.showToast({
  39.                         message: 'native ad click',
  40.                         duration: 1000
  41.                       });
  42.                       break;
  43.                     case 'onAdClose':
  44.                       Prompt.showToast({
  45.                         message: 'native ad close',
  46.                         duration: 1000
  47.                       });
  48.                       break;
  49.                     default:
  50.                   }
  51.                 }
  52.               }
  53.             })
  54.               .width('100%')
  55.           }
  56.         })
  57.       }
  58.       .listDirection(Axis.Vertical)
  59.       .scrollBar(BarState.Off)
  60.       .friction(0.6)
  61.       .divider({
  62.         strokeWidth: 2,
  63.         color: Color.White,
  64.         startMargin: 20,
  65.         endMargin: 20
  66.       })
  67.       .edgeEffect(EdgeEffect.Spring)
  68.       .width('100%')
  69.       .height('100%')
  70.     }.width('100%').height('100%')
  71.   }
  72. }
复制代码
开屏广告

场景先容

开屏广告是一种在应用启动时且在应用主界面表现之前需要被展示的广告。您需要预先为App设计一伸开屏默认的Slogan图片,确保在未获得到开屏广告之前展示默认的Slogan,提供精良的用户体验。
开屏广告分为全屏开屏广告、半屏开屏广告,此中全屏开屏广告展示形式为广告铺满整个页面;半屏开屏广告展示形式会根据媒体页面自定义布局渲染广告、icon和版权信息,一般情况下发起将icon和版权信息展示在广告下方。

简单使用

先请求广告
  1. import { router, Prompt } from '@kit.ArkUI';
  2. import { advertising, identifier } from '@kit.AdsKit';
  3. import { common } from '@kit.AbilityKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. import { BusinessError } from '@kit.BasicServicesKit';
  6. @Entry
  7. @Component
  8. export struct Index {
  9.   private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  10.   private oaid: string = '';
  11.   private isTimeOut: boolean = false;
  12.   // 超时时间(单位毫秒),开发者可根据实际情况修改
  13.   private timeOutDuration: number = 1 * 1000;
  14.   // 超时index
  15.   private timeOutIndex: number = -1;
  16.   // 广告展示参数
  17.   private adDisplayOptions: advertising.AdDisplayOptions = {
  18.     // 是否静音,默认不静音
  19.     mute: false
  20.   }
  21.   // 广告配置
  22.   private adOptions: advertising.AdOptions = {
  23.     // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
  24.     allowMobileTraffic: 0,
  25.     // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
  26.     tagForChildProtection: -1,
  27.     // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
  28.     tagForUnderAgeOfPromise: -1,
  29.     // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
  30.     adContentClassification: 'A'
  31.   }
  32.   // 开屏视频广告请求参数
  33.   private splashVideoAdReqParams: advertising.AdRequestParams = {
  34.     // 'testd7c5cewoj6'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
  35.     adId: 'testd7c5cewoj6',
  36.     adType: AdType.SPLASH_AD,
  37.     adCount: 1,
  38.     oaid: this.oaid
  39.   }
  40.   // 开屏图片广告请求参数
  41.   private splashImageAdReqParams: advertising.AdRequestParams = {
  42.     // 'testq6zq98hecj'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
  43.     adId: 'testq6zq98hecj',
  44.     adType: AdType.SPLASH_AD,
  45.     adCount: 1,
  46.     oaid: this.oaid
  47.   }
  48.   aboutToAppear() {
  49.     hilog.info(0x0000, 'testTag', '%{public}s', 'Start to aboutToAppear');
  50.     try {
  51.       // 使用Promise回调方式获取OAID
  52.       identifier.getOAID().then((data: string) => {
  53.         this.oaid = data;
  54.         hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in getting adsIdentifierInfo by promise');
  55.       }).catch((error: BusinessError) => {
  56.         hilog.error(0x0000, 'testTag', '%{public}s',
  57.           `Failed to get adsIdentifierInfo, code: ${error.code}, message: ${error.message}`);
  58.       })
  59.     } catch (error) {
  60.       hilog.error(0x0000, 'testTag', '%{public}s', `Catch err, code: ${error.code}, message: ${error.message}`);
  61.     }
  62.   }
  63.   build() {
  64.     Column() {
  65.       Column() {
  66.         // 跳转到开屏全屏视频广告展示页面
  67.         CustomButton({
  68.           mText: 'splash full screen request', mOnClick: () => {
  69.             this.requestAd(this.splashVideoAdReqParams, this.adOptions);
  70.           }
  71.         });
  72.         // 跳转到开屏半屏图片广告展示页面
  73.         CustomButton({
  74.           mText: 'splash half screen request', mOnClick: () => {
  75.             this.requestAd(this.splashImageAdReqParams, this.adOptions);
  76.           }
  77.         });
  78.       }.width('100%').height('80%').justifyContent(FlexAlign.Center)
  79.     }
  80.     .width('100%')
  81.     .height('100%')
  82.   }
  83.   private requestAd(adReqParams: advertising.AdRequestParams, adOptions: advertising.AdOptions): void {
  84.     // 广告请求回调监听
  85.     const adLoaderListener: advertising.AdLoadListener = {
  86.       // 广告请求失败回调
  87.       onAdLoadFailure: (errorCode: number, errorMsg: string) => {
  88.         clearTimeout(this.timeOutIndex);
  89.         if (this.isTimeOut) {
  90.           return;
  91.         }
  92.         hilog.error(0x0000, 'testTag', '%{public}s',
  93.           `Failed to request ad. errorCode is: ${errorCode}, errorMsg is: ${errorMsg}`);
  94.         Prompt.showToast({
  95.           message: `Failed to request ad, code is:  ${errorCode} , errorMsg is: ${errorMsg}`,
  96.           duration: 1000
  97.         });
  98.       },
  99.       // 广告请求成功回调
  100.       onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
  101.         clearTimeout(this.timeOutIndex);
  102.         if (this.isTimeOut) {
  103.           return;
  104.         }
  105.         hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in requesting ad!');
  106.         // 保存请求到的广告内容用于展示
  107.         hilog.info(0x0000, 'testTag', '%{public}s', `ads[0].adType is : ${ads[0].adType}`);
  108.         if (canIUse("SystemCapability.Advertising.Ads")) {
  109.           if (ads[0].adType === AdType.SPLASH_AD) {
  110.             // 调用开屏广告展示页面
  111.             if (ads[0]?.isFullScreen === true) {
  112.               routePage('pages/SplashFullScreenAdPage', ads, this.adDisplayOptions);
  113.             } else {
  114.               routePage('pages/SplashHalfScreenAdPage', ads, this.adDisplayOptions);
  115.             }
  116.           } else {
  117.             hilog.error(0x0000, 'testTag', '%{public}s', 'Error adType');
  118.           }
  119.         }
  120.       }
  121.     };
  122.     // 创建AdLoader广告对象
  123.     const load: advertising.AdLoader = new advertising.AdLoader(this.context);
  124.     // 调用广告请求接口
  125.     hilog.info(0x0000, 'testTag', '%{public}s', 'Request ad!');
  126.     adReqParams.oaid = this.oaid;
  127.     this.timeOutHandler();
  128.     load.loadAd(adReqParams, adOptions, adLoaderListener);
  129.   }
  130.   private timeOutHandler(): void {
  131.     this.isTimeOut = false;
  132.     // 超时处理
  133.     this.timeOutIndex = setTimeout(() => {
  134.       this.isTimeOut = true;
  135.       const options: router.RouterOptions = {
  136.         // 开发者可根据项目实际情况修改超时之后要跳转的目标页面
  137.         url: 'pages/AdsServicePage',
  138.       };
  139.       router.pushUrl(options);
  140.       hilog.error(0x0000, 'testTag', '%{public}s', 'load ad time out');
  141.     }, this.timeOutDuration);
  142.   }
  143. }
  144. async function routePage(pageUri: string, ads: Array<advertising.Advertisement | null>,
  145.   displayOptions: advertising.AdDisplayOptions) {
  146.   let options: router.RouterOptions = {
  147.     url: pageUri,
  148.     params: {
  149.       ads: ads,
  150.       displayOptions: displayOptions
  151.     }
  152.   }
  153.   try {
  154.     hilog.info(0x0000, 'testTag', '%{public}s', `RoutePage: ${pageUri}`);
  155.     router.pushUrl(options);
  156.   } catch (error) {
  157.     hilog.error(0x0000, 'testTag', '%{public}s',
  158.       `Failed to routePage callback, code: ${error.code}, msg: ${error.message}`);
  159.   }
  160. }
  161. export enum AdType {
  162.   // 开屏广告的类型
  163.   SPLASH_AD = 1
  164. }
  165. @Component
  166. export struct CustomButton {
  167.   private mText: string | Resource = '';
  168.   private mHeight: number = 40;
  169.   private mOnClick: (event?: ClickEvent) => void = (): void => {
  170.   };
  171.   build() {
  172.     Column() {
  173.       Button(this.mText)
  174.         .backgroundColor('#d3d4d6')
  175.         .fontSize(20)
  176.         .fontColor('#000')
  177.         .fontWeight(FontWeight.Normal)
  178.         .align(Alignment.Center)
  179.         .type(ButtonType.Capsule)
  180.         .width('90%')
  181.         .height(this.mHeight)
  182.         .margin({ top: 10, bottom: 5 })
  183.         .onClick(this.mOnClick);
  184.     }
  185.   }
  186. }
复制代码
再展示广告(半屏广告):
  1. import { Prompt, router } from '@kit.ArkUI';
  2. import { advertising, AdComponent } from '@kit.AdsKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. @Entry
  5. @Component
  6. export struct SplashHalfScreenAdPage {
  7.   private ads: Array<advertising.Advertisement> = [];
  8.   private displayOptions?: advertising.AdDisplayOptions;
  9.   aboutToAppear() {
  10.     hilog.info(0x0000, 'testTag', '%{public}s', 'Start to splashHalfScreenAdPage aboutToAppear');
  11.     const params: Record<string, Object> = router.getParams() as Record<string, Object>;
  12.     if (params && params.ads as Array<advertising.Advertisement> &&
  13.       params.displayOptions as advertising.AdDisplayOptions) {
  14.       this.ads = params.ads as Array<advertising.Advertisement>;
  15.       this.displayOptions = params.displayOptions as advertising.AdDisplayOptions;
  16.     } else {
  17.       hilog.info(0x0000, 'testTag', '%{public}s', 'Router params are empty');
  18.     }
  19.   }
  20.   build() {
  21.     Column() {
  22.       // 运行在提供方进程里
  23.       AdComponent({
  24.         ads: this.ads, displayOptions: this.displayOptions,
  25.         interactionListener: {
  26.           onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
  27.             switch (status) {
  28.               case AdStatus.AD_OPEN:
  29.                 hilog.info(0x0000, 'testTag', '%{public}s', 'Status is onAdOpen');
  30.                 Prompt.showToast({
  31.                   message: 'splash ad open',
  32.                   duration: 1000
  33.                 });
  34.                 break;
  35.               case AdStatus.AD_CLICKED:
  36.                 hilog.info(0x0000, 'testTag', '%{public}s', 'Status is onAdClick');
  37.                 Prompt.showToast({
  38.                   message: 'splash ad click',
  39.                   duration: 1000
  40.                 });
  41.                 break;
  42.               case AdStatus.AD_CLOSED:
  43.                 hilog.info(0x0000, 'testTag', '%{public}s', 'Status is onAdClose');
  44.                 Prompt.showToast({
  45.                   message: 'splash ad close',
  46.                   duration: 1000
  47.                 });
  48.                 router.replaceUrl({
  49.                   url: 'pages/Index',
  50.                 })
  51.                 break;
  52.             }
  53.           }
  54.         }
  55.       })
  56.         .width('100%')
  57.         .height('87%')
  58.       // 展示媒体自定义icon、应用名称、版权信息
  59.       Column({}) {
  60.         Row() {
  61.           Image($r('app.media.video')).width(24).height(24).margin({ right: 8 })
  62.           Text($r('app.string.video')).fontColor('#1A1A1A').fontSize(16).width(32).height(21)
  63.         }.margin({ bottom: 8 })
  64.         Column() {
  65.           Text($r('app.string.copyright')).fontColor('#1A1A1A').fontSize(9).height(15)
  66.         }
  67.       }.width('100%').height('100%')
  68.     }
  69.   }
  70. }
  71. export enum AdStatus {
  72.   AD_OPEN = 'onAdOpen',
  73.   AD_CLICKED = 'onAdClick',
  74.   AD_CLOSED = 'onAdClose'
  75. }
复制代码
广告接口封装

  1. import { router } from '@kit.ArkUI';
  2. import { advertising, identifier } from '@kit.AdsKit';
  3. import { common, abilityAccessCtrl } from '@kit.AbilityKit';
  4. import { BusinessError } from '@kit.BasicServicesKit';
  5. import { Log } from './logutil';
  6. /**
  7. * 广告类型
  8. */
  9. export enum AdType {
  10.   // 开屏广告的类型
  11.   SPLASH_AD = 1,
  12.   // 原生广告的类型
  13.   NATIVE_AD = 3,
  14.   //8:banner广告。
  15.   BANNER_AD = 8
  16.   //12:插屏广告。
  17.   //60:贴片广告。
  18. }
  19. /**
  20. * 广告状态
  21. */
  22. export enum AdStatus {
  23.   AD_OPEN = "onAdOpen",
  24.   AD_CLICKED = "onAdClick",
  25.   AD_CLOSED = "onAdClose",
  26.   AD_LOAD = "AD_LOAD",
  27.   AD_FAIL = "AD_FAIL"
  28. }
  29. export default class AdUtil {
  30.   /**
  31.    * 设备oaid
  32.    */
  33.   public static oaid: string = '';
  34.   /**
  35.    * 广告展示参数
  36.    */
  37.   public adDisplayOptions: advertising.AdDisplayOptions = {
  38.     // 是否静音,默认不静音
  39.     mute: false,
  40.     // 广告轮播的时间间隔,单位ms,取值范围[30000, 120000]
  41.     refreshTime: 30000
  42.   }
  43.   /**
  44.    * 原生广告配置
  45.    */
  46.   public adOptions: advertising.AdOptions = {
  47.     // 是否允许流量下载  0不允许 1允许,不设置以广告主设置为准
  48.     allowMobileTraffic: 1,
  49.     // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
  50.     tagForChildProtection: -1,
  51.     // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
  52.     tagForUnderAgeOfPromise: -1,
  53.     // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
  54.     adContentClassification: 'A'
  55.   }
  56.   // Banner广告请求参数
  57.   public bannerAdReqParams: advertising.AdRequestParams = {
  58.     adId: 'x5txrf02lv',
  59.     adType: AdType.BANNER_AD,
  60.     adCount: 1,
  61.     adWidth: 360,
  62.     adHeight: 57
  63.   }
  64.   /**
  65.    * 开屏视频广告请求参数
  66.    */
  67.   public splashVideoAdReqParams: advertising.AdRequestParams = {
  68.     adId: 'x09l50xtco',
  69.     adType: AdType.SPLASH_AD,
  70.     adCount: 1
  71.   }
  72.   /**
  73.    * 开屏图片广告请求参数
  74.    */
  75.   public splashImageAdReqParams: advertising.AdRequestParams = {
  76.     adId: 'testq6zq98hecj',
  77.     adType: AdType.SPLASH_AD,
  78.     adCount: 1,
  79.     oaid:AdUtil.oaid
  80.   }
  81.   /**
  82.    * 原生视频广告请求参数
  83.    */
  84.   public nativeVideoAdReqParams: advertising.AdRequestParams = {
  85.     adId: 't5q3phvauy',
  86.     adType: AdType.NATIVE_AD,
  87.     adCount: 1,
  88.     // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  89.     enableDirectReturnVideoAd: true
  90.   }
  91.   /**
  92.    * 原生大图广告请求参数
  93.    */
  94.   public nativeBigImageAdReqParams: advertising.AdRequestParams = {
  95.     adId: 't5q3phvauy',
  96.     adType: AdType.NATIVE_AD,
  97.     adCount: 1,
  98.     // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  99.     enableDirectReturnVideoAd: true
  100.   }
  101.   /**
  102.    * 原生三图广告请求参数
  103.    */
  104.   public nativeThreeImageAdReqParams: advertising.AdRequestParams = {
  105.     adId: 't5q3phvauy',
  106.     adType: AdType.NATIVE_AD,
  107.     adCount: 1,
  108.     // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  109.     enableDirectReturnVideoAd: true
  110.   }
  111.   /**
  112.    * 原生小图广告请求参数
  113.    */
  114.   public nativeSmallImageAdReqParams: advertising.AdRequestParams = {
  115.     adId: 't5q3phvauy',
  116.     adType: AdType.NATIVE_AD,
  117.     adCount: 1,
  118.     // 原生广告自定义扩展参数。等所有广告素材下载完后再回调
  119.     enableDirectReturnVideoAd: true
  120.   }
  121.   /**
  122.    * 获取 OAID
  123.    * @param context
  124.    */
  125.   public requestOAIDTrackingConsentPermissions(context: common.Context): void {
  126.     // 进入页面时,向用户请求授权广告跨应用关联访问权限
  127.     const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  128.     try {
  129.       atManager.requestPermissionsFromUser(context, ['ohos.permission.APP_TRACKING_CONSENT']).then((data) => {
  130.         if (data.authResults[0] === 0) {
  131.           Log.info('Succeeded in requesting permission');
  132.           identifier.getOAID().then((data: string) => {
  133.             AdUtil.oaid = data;
  134.             Log.info('Succeeded in getting adsIdentifierInfo by promise : ' + data);
  135.           }).catch((error: BusinessError) => {
  136.             Log.error(`Failed to get AdsIdentifierInfo, message: ${error.message}`);
  137.           })
  138.         } else {
  139.           Log.info('user rejected');
  140.         }
  141.       }).catch((err: BusinessError) => {
  142.         Log.error(`Failed to request permission , error: ${err.code} ${err.message}`);
  143.       })
  144.     } catch (err) {
  145.       Log.error(`catch err, code: ${err.code}, msg: ${err.message}`);
  146.     }
  147.   }
  148.   public requestAd(context: common.Context, adReqParams: advertising.AdRequestParams, adOptions: advertising.AdOptions,
  149.     routePage: string,errPage:string): void {
  150.     // 给AdRequestParams设置oaid参数
  151.     adReqParams.oaid = AdUtil.oaid;
  152.     // 广告请求回调监听
  153.     const adLoaderListener: advertising.AdLoadListener = {
  154.       // 广告请求失败回调
  155.       onAdLoadFailure: (errorCode: number, errorMsg: string) => {
  156.         Log.error(`request ad errorCode is: ${errorCode}, errorMsg is: ${errorMsg}`);
  157.         if (errPage != '') {
  158.           this.routePage(errPage);
  159.         }
  160.       },
  161.       // 广告请求成功回调
  162.       onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
  163.         Log.info('succeeded in requesting ad!');
  164.         // 保存请求到的广告内容用于展示
  165.         if (canIUse('SystemCapability.Advertising.Ads')) {
  166.           if (ads[0].adType === AdType.SPLASH_AD) {
  167.             // 调用开屏广告展示页面
  168.             if (ads[0]?.isFullScreen === true) {
  169.               this.routePage('pages/SplashFullScreenAdPage', ads, this.adDisplayOptions);
  170.             } else {
  171.               this.routePage('pages/SplashHalfScreenAdPage', ads, this.adDisplayOptions);
  172.             }
  173.           } else {
  174.             this.routePage(routePage, ads, this.adDisplayOptions);
  175.             //hilog.error(0x0000, 'testTag', '%{public}s', 'Error adType');
  176.           }
  177.         }
  178.       }
  179.     };
  180.     // 创建AdLoader广告对象
  181.     const load: advertising.AdLoader = new advertising.AdLoader(context);
  182.     // 调用广告请求接口
  183.     Log.info('request ad!');
  184.     load.loadAd(adReqParams, adOptions, adLoaderListener);
  185.   }
  186.   public routePage(pageUri: string, ads?: Array<advertising.Advertisement | null>,
  187.     displayOptions?: advertising.AdDisplayOptions) {
  188.     let options: router.RouterOptions = {
  189.       url: pageUri,
  190.       params: {
  191.         ads: ads,
  192.         displayOptions: displayOptions
  193.       }
  194.     }
  195.     try {
  196.       Log.info(`routePage  + ${pageUri}`);
  197.       router.replaceUrl(options);
  198.     } catch (error) {
  199.       Log.error(`routePage fail callback, code: ${error.code}, msg: ${error.message}`);
  200.     }
  201.   }
  202. }
  203. export const adUtils = new AdUtil()
复制代码
封装后使用

  1. // 组件生命周期
  2.   async aboutToAppear() {
  3.     Log.info('StartPage aboutToAppear');
  4.     let value:Object = await PreferencesUtils.getPreferences(Constant.KEY_IS_FIRST_OPEN);
  5.     if(value === null || value === 'YES'){
  6.       this.privacyDialogController?.open()
  7.     }else{
  8.       adUtils.requestOAIDTrackingConsentPermissions(this.context);
  9.       adUtils.requestAd(this.context,adUtils.splashImageAdReqParams,adUtils.adDisplayOptions,'pages/SplashFullScreenAdPage','pages/Index')
  10.      
  11.     }
  12.   }
复制代码
作者:csdn猫哥blog.csdn.net/qq8864,转载请注明出处。
团队:坚果派
团队先容:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他范畴的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁夏等地,现在已开发鸿蒙原生应用,三方库60+,接待交换。
                        
原文链接:https://blog.csdn.net/yyz_1987/article/details/144561085
 
其他资源

文档中心--Ads Kit(广告服务)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表