华为HarmonyOS打造开放、合规的广告生态 - 插屏广告

场景介绍

插屏广告是一种在应用开启、暂停或退出时以全屏或半屏的形式弹出的广告形式,展示时机巧妙避开用户对应用的正常体验,尺寸大,曝光效果好。

接口说明

接口名

描述

loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void

请求单广告位广告,通过AdRequestParams、AdOptions进行广告请求参数设置,通过AdLoadListener监听广告请求回调。

showAd(ad: Advertisement, options: AdDisplayOptions, context?: common.UIAbilityContext): void

展示广告,通过AdDisplayOptions进行广告展示参数设置。

开发步骤

  1. 获取OAID。

    如果想要为用户更精准的推送广告,可以在请求参数AdRequestParams中添加oaid属性。

    如何获取OAID参见获取OAID信息。

    说明

    使用以下示例中提供的测试广告位必须先获取OAID信息。

  2. 请求单广告位广告。

    需要先创建一个AdLoader对象,通过AdLoader的loadAd方法请求广告,最后通过AdLoadListener来监听广告的加载状态。

    请求广告关键参数如下所示:

    请求广告参数名

    类型

    必填

    说明

    adType

    number

    请求广告类型,插屏广告类型为12。

    adId

    string

    广告位ID。

    • 如果仅调测广告,可使用测试广告位ID:testb4znbuh3n2。
    • 如果要接入正式广告,则需要申请正式的广告位ID。可在应用发布前进入流量变现官网,点击“开始变现”,登录鲸鸿动能媒体服务平台进行申请,具体操作详情请参见展示位创建。

    oaid

    string

    开放匿名设备标识符,用于精准推送广告。不填无法获取到个性化广告。

    示例代码如下所示:

     
    1. import { advertising, identifier } from '@kit.AdsKit';
    2. import { common } from '@kit.AbilityKit';
    3. import { hilog } from '@kit.PerformanceAnalysisKit';
    4. import { BusinessError } from '@kit.BasicServicesKit';
    5. @Entry
    6. @Component
    7. struct Index {
    8. private ads: Array<advertising.Advertisement> = [];
    9. private context = getContext(this) as common.UIAbilityContext;
    10. private oaid: string = '';
    11. aboutToAppear() {
    12. try {
    13. // 使用Promise回调方式获取OAID
    14. identifier.getOAID().then((data) => {
    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', `Failed to get adsIdentifierInfo, message: ${error.message}`);
    19. })
    20. } catch (error) {
    21. hilog.error(0x0000, 'testTag', '%{public}s', `Catch err, code: ${error.code}, message: ${error.message}`);
    22. }
    23. }
    24. build() {
    25. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
    26. Row() {
    27. Button('requestAd').onClick(() => {
    28. let load: advertising.AdLoader = new advertising.AdLoader(this.context);
    29. this.requestAd(load);
    30. }).width('45%')
    31. }
    32. }
    33. }
    34. private requestAd(adLoader: advertising.AdLoader): void {
    35. const adRequestParam: advertising.AdRequestParams = {
    36. // 广告类型:插屏广告
    37. adType: 12,
    38. // 'testb4znbuh3n2'为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
    39. adId: 'testb4znbuh3n2',
    40. // 开放匿名设备标识符
    41. oaid: this.oaid
    42. };
    43. const adOption: advertising.AdOptions = {
    44. // 设置是否请求非个性化广告
    45. nonPersonalizedAd: 0,
    46. // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
    47. allowMobileTraffic: 0,
    48. // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
    49. tagForChildProtection: -1,
    50. // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
    51. tagForUnderAgeOfPromise: -1,
    52. // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
    53. adContentClassification: 'A'
    54. };
    55. const adLoaderListener: advertising.AdLoadListener = {
    56. onAdLoadFailure: (errorCode: number, errorMsg: string) => {
    57. hilog.error(0x0000, 'testTag', '%{public}s',
    58. `Failed to request ad, message: ${errorMsg}, error code: ${errorCode}`);
    59. },
    60. onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
    61. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in requesting ad!');
    62. this.ads = [];
    63. this.ads.push(...ads);
    64. },
    65. };
    66. adLoader.loadAd(adRequestParam, adOption, adLoaderListener);
    67. }
    68. }

  3. 事件订阅。

    开发者需要在App中订阅com.huawei.hms.pps.action.PPS_INTERSTITIAL_STATUS_CHANGED事件来监听插屏广告页面变化并接收插屏信息。示例代码中的订阅方法registerPPSReceiver()需要在每次展示广告前调用 。

    在订阅到公共事件后,可以从CommonEventData的parameters参数中使用"interstitial_ad_status"作为key值获取插屏广告页面变化状态。

    示例代码如下所示:

     
    1. import { commonEventManager, BusinessError } from '@kit.BasicServicesKit';
    2. import { hilog } from '@kit.PerformanceAnalysisKit';
    3. const KEY_INTERSTITIAL_STATUS = 'interstitial_ad_status';
    4. export class InterstitialAdStatusHandler {
    5. // 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
    6. private subscriber: commonEventManager.CommonEventSubscriber | null = null;
    7. // 订阅方法,需要在每次展示广告前调用
    8. public registerPPSReceiver(): void {
    9. if (this.subscriber) {
    10. this.unRegisterPPSReceiver();
    11. }
    12. // 订阅者信息
    13. const subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
    14. events: ['com.huawei.hms.pps.action.PPS_INTERSTITIAL_STATUS_CHANGED'],
    15. publisherBundleName: 'com.huawei.hms.adsservice'
    16. };
    17. // 创建订阅者回调
    18. commonEventManager.createSubscriber(subscribeInfo,
    19. (err: BusinessError, commonEventSubscriber: commonEventManager.CommonEventSubscriber) => {
    20. if (err) {
    21. hilog.error(0x0000, 'testTag', '%{public}s', `CreateSubscriber error, ${err.code}, message: ${err.message}}`);
    22. return;
    23. }
    24. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in creating subscriber');
    25. this.subscriber = commonEventSubscriber;
    26. // 订阅公共事件回调
    27. if (!this.subscriber) {
    28. hilog.warn(0x0000, 'testTag', '%{public}s', 'Need to create subscriber');
    29. return;
    30. }
    31. commonEventManager.subscribe(this.subscriber,
    32. (err: BusinessError, commonEventData: commonEventManager.CommonEventData) => {
    33. if (err) {
    34. hilog.error(0x0000, 'testTag', '%{public}s', `Subscribe error, ${err.code}, message: ${err.message}`);
    35. } else {
    36. // 订阅者成功接收到公共事件
    37. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded subscribing data');
    38. // 获取插屏广告页面变化状态
    39. const status: string = commonEventData?.parameters?.[KEY_INTERSTITIAL_STATUS];
    40. switch (status) {
    41. case AdStatus.AD_OPEN:
    42. hilog.info(0x0000, 'testTag', '%{public}s', 'onAdOpen');
    43. break;
    44. case AdStatus.AD_CLICKED:
    45. hilog.info(0x0000, 'testTag', '%{public}s', 'onAdClick');
    46. break;
    47. case AdStatus.AD_CLOSED:
    48. hilog.info(0x0000, 'testTag', '%{public}s', 'onAdClose');
    49. this.unRegisterPPSReceiver();
    50. break;
    51. case AdStatus.AD_VIDEO_START:
    52. hilog.info(0x0000, 'testTag', '%{public}s', 'onAdVideoStart');
    53. break;
    54. case AdStatus.AD_COMPLETED:
    55. hilog.info(0x0000, 'testTag', '%{public}s', 'onAdCompleted');
    56. break;
    57. default:
    58. break;
    59. }
    60. }
    61. });
    62. });
    63. }
    64. // 取消订阅
    65. public unRegisterPPSReceiver(): void {
    66. commonEventManager.unsubscribe(this.subscriber, (err: BusinessError) => {
    67. if (err) {
    68. hilog.error(0x0000, 'testTag', '%{public}s', `Unsubscribe error, ${err.code}, message: ${err.message}}`);
    69. } else {
    70. hilog.info(0x0000, 'testTag', '%{public}s', 'Succeeded in unsubscribing');
    71. this.subscriber = null;
    72. }
    73. });
    74. }
    75. }
    76. enum AdStatus {
    77. AD_OPEN = 'onAdOpen',
    78. AD_CLICKED = 'onAdClick',
    79. AD_CLOSED = 'onAdClose',
    80. AD_VIDEO_START = 'onVideoPlayBegin',
    81. AD_COMPLETED = 'onVideoPlayEnd'
    82. }

  4. 展示广告。

    ads为步骤2请求到的广告信息,调用showAd方法来展示广告。示例代码如下所示:

     
    1. import { advertising } from '@kit.AdsKit';
    2. import { common } from '@kit.AbilityKit';
    3. @Entry
    4. @Component
    5. struct Index {
    6. private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    7. // 步骤2中请求到的广告内容
    8. private ads: Array<advertising.Advertisement> = [];
    9. private displayOptions: advertising.AdDisplayOptions = {
    10. // 插屏广告视频播放是否静音
    11. mute: true
    12. };
    13. build() {
    14. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
    15. Row() {
    16. Button('showAd').onClick(() => {
    17. this.showAd();
    18. }).width('45%')
    19. }
    20. }
    21. }
    22. private showAd() {
    23. // 请在此处自行增加步骤3中的,注册插屏广告状态监听器
    24. // ...
    25. // 此处ads[0]表示请求到的第一个广告,用户根据实际情况选择
    26. advertising.showAd(this.ads[0], this.displayOptions, this.context);
    27. }
    28. }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在VScode中配置C_C++环境

众所周知&#xff0c;VScode是一个轻量&#xff0c;简便&#xff0c;功能强大的编辑器&#xff0c;我们可以在里面编写各种各样的代码&#xff0c;但是在C/C代码编译运行的时候&#xff0c;我们需要对环境进行一些适配&#xff0c;废话不多说&#xff0c;请看下面的详细步骤。 …

医疗器械设备语音ic芯片方案-选型大全

在医疗设备领域&#xff0c;深圳唯创知音提供了多款适用的语音IC产品&#xff0c;以下是其中几款较为常见的推荐&#xff1a; 一、WT588F02X-8S 特点&#xff1a; 1&#xff1a;低成本人机交互语音方案&#xff0c;仅需嵌入在产品中&#xff0c;提升医疗设备智能化水平。 2&…

论文笔记(五十四)pi0: A Vision-Language-Action Flow Model for General Robot Control

π0: A Vision-Language-Action Flow Model for General Robot Control 文章概括摘要I. INTRODUCTIONII. RELATED WORKIII. OVERVIEWIV. π 0 \pi_0 π0​模型V. 数据收集和培训配方A. 预训练和后训练B. 语言和高级策略C. 机器人系统细节 VI. 实验评估A. 基础模型评估B. 遵循语…

【含开通报告+文档+源码】基于SpringBoot的新能源充电桩管理系统的设计与实现

开题报告 近年来&#xff0c;随着全球对环境问题的关注和新能源汽车的普及&#xff0c;新能源充电桩的需求显著增加[1]。为了满足大量新能源车辆的充电需求&#xff0c;各地纷纷建设新能源充电桩站点。然而&#xff0c;随着充电桩数量的增加&#xff0c;管理和运营充电桩也面临…

克服奖励欺骗:Meta发布全新后训练方式CGPO,编程水平直升5%,打破RLHF瓶颈

克服奖励欺骗&#xff1a;Meta发布全新后训练方式CGPO&#xff0c;编程水平直升5%&#xff0c;打破RLHF瓶颈 在人工智能领域&#xff0c;奖励欺骗成为了多任务学习中的一大难题&#xff0c;严重影响了大型语言模型&#xff08;LLMs&#xff09;的表现。为了有效应对这一挑战&a…

Python小游戏19——滑雪小游戏

运行效果 python代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("滑雪小游戏") # 定义颜色 WH…

goframe开发一个企业网站 前端界面 拆分界面7

将页面拆出几个公用部分 在resource/template/front创建meta.html header.html footer.html meta.html <head><meta charset"utf-8"><meta content"widthdevice-width, initial-scale1.0" name"viewport"><title>{{.…

读书笔记#深入理解Java虚拟机(第三版)# Java内存模型与线程

深入理解Java虚拟机&#xff08;第三版&#xff09;# 高效并发 chap12 Java内存模型与线程 概述 在许多场景下&#xff0c;让计算机同时去做几件事情&#xff0c;不仅是因为计算机的运算能力强大了&#xff0c;还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的…

鸿蒙笔记--自定义点击事件

这一节主要了解一下鸿蒙中自定义点击事件&#xff0c;主要是实现在父组件点击子组件后获取子组件的返回参数。 栗子&#xff1a; import { MyCustomButton } from ./MyCustomButton;Entry Component struct Index {State message: string Hello World;build() {Column(){MyC…

第三十一章 Vue之路由(VueRouter)

目录 一、引言 1.1. 路由介绍 二、VueRouter 三、VueRouter的使用 3.1. 使用步骤&#xff08;52&#xff09; 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Friend.vue 3.2.4. My.vue 3.2.5. Find.vue 一、引言 1.1. 路由介绍 Vue中路由就是路径和组件的映…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C 标准库中的一个模板结构体&#xff0c;它用于条件编译和 SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;。enable_if 的主要作用是通过条件编译来控制模板的实例化&#xff0c;从而实现条件编译和 SFINAE。 1. enable_if 的基本用法如下…

【自然资源】关于多测合一,你了解吗?

关于多测合一&#xff0c;你了解吗&#xff1f; “多测合一” 是指&#xff1a;按照“统一标准、多测合并、成果共享”要求和“应合尽合、能合则合”原则&#xff0c;对同一工程建设项目各个阶段的多项测绘服务事项进行整合优化的测绘服务和管理模式。 是将工程建设项目竣工验…

江协科技STM32学习- P28 USART串口数据包

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(二)

书接上回&#xff0c;让我们继续来学习ArkUI的其他组件 目录&#xff0c;可以点击跳转到想要了解的组件详细内容 组件四&#xff1a;Button组件五&#xff1a;Slider组件六&#xff1a; Column & Row组件七&#xff1a;循环控制组件八&#xff1a; List 组件四&#xff1a;…

SqlSugar查询达梦数据库遇到的异常情况

使用SqlSugar连接达梦数据库&#xff0c;联查两张表的数据遇到的奇怪问题&#xff1a;同一套代码&#xff0c;在一个环境中可以正常查询并返回数据&#xff0c;但在另一环境中运行则查不到数据。在个人电脑上测试时也能正确运行&#xff0c;搞不清楚是怎么回事&#xff0c;特此…

ip地址分为几大类-IP和子网掩码对照表

一、IP地址的基本概念与分类 IP地址是用于在网络中标识每个设备的逻辑地址。互联网协议将IP地址分为A、B、C、D和E五类&#xff0c;其中A、B、C三类最常用&#xff0c;它们主要根据地址的首位位数以及用途进行划分。 A类地址&#xff1a; 范围&#xff1a;0.0.0.0 - 127.255.2…

【AI开源项目】Botpress - 开源智能聊天机器人平台及其部署方案

文章目录 Botpress 概述Botpress 的定位 Botpress 的主要特点1. OpenAI 集成2. 易于使用3. 定制和扩展性4. 多平台支持5. 集成和扩展 API6. 活跃的社区和详尽的文档 部署方案集成集成开发集成部署机器人示例开发工具代理本地开发先决条件从源代码构建 Botpress 如何解决常见问题…

JetPack Compose安卓开发之底部导航Tabbar

效果&#xff0c;页面切换 项目结构 TabBar.kt package com.weimin.strollerapp.components.tabbarimport androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.f…

SpringBoot应用:精品在线试题库的设计与实现

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Sprin…