鸿蒙Next原生广告展示白屏

鸿蒙Next原生广告展示白屏 我在进行原生广告的多广告请求的时,广告展示偶尔白屏,使用的是AdComponent 组件

测试广告位id为 testu7m3hc4gvm

测试广告位id为 testb65czjivt9

我的请求方法及内容如下

export function requestMultiAds(context: common.UIAbilityContext, adParams: advertising.AdRequestParams[], callback?: AdReqCallback) {

  let TAG: string = 'requestMultiAds'
  // 广告配置
  let adOptions: advertising.AdOptions = {
    // 设置是否请求非个性化广告
    nonPersonalizedAd: 0,
    // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
    allowMobileTraffic: 0,
    // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
    tagForChildProtection: -1,
    // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
    tagForUnderAgeOfPromise: -1,
    // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
    adContentClassification: 'A'
  }
  // 广告展示参数
  let displayOptions: advertising.AdDisplayOptions = {
    // 是否静音,默认不静音
    mute: false
  }

  try {
    // 广告请求回调监听
    const adLoaderListener: advertising.MultiSlotsAdLoadListener = {
      // 广告请求失败回调
      onAdLoadFailure: (errorCode: number, errorMsg: string) => {
       LogUtils.wtf(TAG, `Failed to request ad errorCode is: ${errorCode}, errorMsg is: ${errorMsg}`)
        callback?.adFailure(errorCode, errorMsg)
      },
      // 广告请求成功回调
      onAdLoadSuccess: (ads: Map<string, Array<advertising.Advertisement>>) => {
        LogUtils.wtf(TAG, 'Succeeded in requesting ad!')
        // 调用原生广告展示页面
        callback?.adMultiSucc(ads, displayOptions)
      }
    };
    // 创建AdLoader广告对象
    const load: advertising.AdLoader = new advertising.AdLoader(context);
    // 调用广告请求接口
    load.loadAdWithMultiSlots(adParams, adOptions, adLoaderListener);
  } catch (err) {

  }
}

当我调用的时候内容如下

private native24Hours: Array<advertising.Advertisement> | undefined = [];
private nativeLifeIndex: Array<advertising.Advertisement> | undefined = [];

async requestAd() {
  let adParams: advertising.AdRequestParams[] = []
  // 开关控制
  let slotHours = await SwitchCacheManager.getInstance().isSwitchOpen(
    SwitchParams.SLOT_MAIN_AD_CENTER_NEW_BANNER)
  if (slotHours) adParams.push(PARAMS_NATIVE_FIRST_24HOUR)

  let slotLife = await SwitchCacheManager.getInstance().isSwitchOpen(
    SwitchParams.SLOT_MAIN_AD_BOTTOM)
  if (slotLife) adParams.push(PARAMS_NATIVE_LIFEINDEX)

  if (adParams.length == 0) {
    return
  }
  console.log('adParams.length+++++',JSON.stringify(adParams.length))
  let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext
  let callBack: AdReqCallback = {
    adSuccess: (ads: advertising.Advertisement[],
      options?: advertising.AdDisplayOptions | undefined): void => {
    },
    adFailure: (errorCode: number, errorMsg: string): void => {
      return
    },
    adMultiSucc: (mapAds: Map<string, advertising.Advertisement[]>,
      options?: advertising.AdDisplayOptions | undefined): void => {

      this.native24Hours = mapAds.get(SlotConst.SLOT_NATIVE_FIRST_24HOUR)
      this.nativeLifeIndex = mapAds.get(SlotConst.SLOT_NATIVE_LIFEINDEX)
      console.log('adMultiSucc++++',JSON.stringify(this.native24Hours))
      console.log('++++adMultiSucc++++1',JSON.stringify(this.nativeLifeIndex),JSON.stringify(options))
      this.options = options
    }
  }

  requestMultiAds(context, adParams, callBack)
}

上面的日志如下
adMultiSucc++++ [{ "adType":3,"uniqueId":"95dedd83-c95f-4891-9d46-bd347e66a430","isFullScreen":false,"rewardVerifyConfig":{},"rewarded":false,"shown":false,"clicked":false,"suggestedCompHeight":120,"minEffectiveShowRatio":50}]

++++adMultiSucc++++1 [{ "adType":3,"uniqueId":"","isFullScreen":false,"rewardVerifyConfig":{},"rewarded":false,"shown":false,"clicked":false,"suggestedCompHeight":265,"minEffectiveShowRatio":50}] {"mute":false}

调用广告的组件方法如下

ListItem() {
  First_LifeIndexAD({ ads: this.nativeLifeIndex, options: this.options })
}
@Component
export struct First_LifeIndexAD {

  @State showAd: boolean = true
  private ads: Array<advertising.Advertisement> = []
  private options?: advertising.AdDisplayOptions
  isShowNative() {
    return (this.ads && this.ads.length > 0 && this.showAd)
  }

  build() {
    Column() {
      AdComponent({ ads: this.ads, displayOptions: this.options,
        interactionListener: {
          onStatusChanged: (status: string, ad: advertising.Advertisement, data: string) => {
            switch(status) {
              case AdStatus.AD_OPEN:
                LogUtils.d(TAG, `onAdOpen`);
                break;
              case AdStatus.AD_CLICKED:
                LogUtils.d(TAG, `onAdClick`);
                break;
              case AdStatus.AD_CLOSED:
                LogUtils.d(TAG, `onAdClose`);
                this.showAd = false
                break;
            }
          }}})
        .width('95%')
    }
    .width('95%')
    .height(265)
    .borderRadius(12)
    .margin({left:8,right:8})
    .backgroundColor(Color.White)
    .justifyContent(FlexAlign.Center)
    .visibility(this.isShowNative()?Visibility.Visible:Visibility.None)
  }

}

更多关于鸿蒙Next原生广告展示白屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

更多关于鸿蒙Next原生广告展示白屏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙Next原生广告展示白屏问题可能涉及以下几个方面:

  1. 资源加载问题:广告资源未正确加载或加载失败,导致页面无法渲染。检查资源路径、网络请求状态及资源文件完整性。

  2. 渲染引擎问题:鸿蒙系统渲染引擎在特定情况下可能无法正确渲染广告内容。确保使用的渲染引擎版本与鸿蒙系统兼容。

  3. 权限配置:广告展示可能涉及某些系统权限,如网络权限、存储权限等,未正确配置可能导致白屏。检查应用的权限配置是否符合要求。

  4. API调用错误:广告展示接口调用不当或参数错误可能导致白屏。检查广告展示API的调用方式及传递的参数是否正确。

  5. 系统兼容性:鸿蒙Next系统版本与广告SDK版本可能存在兼容性问题。确认使用的广告SDK版本支持当前鸿蒙系统版本。

  6. 缓存问题:缓存机制可能导致广告内容无法及时更新,出现白屏。尝试清除缓存或重新加载广告内容。

  7. 日志分析:通过系统日志或广告SDK提供的日志工具,分析白屏问题的具体原因,定位问题所在。

以上是可能导致鸿蒙Next原生广告展示白屏的几个常见原因,具体问题需根据实际情况进一步排查。

回到顶部