插全屏广告

插全屏广告

此章节将演示如何请求在Flutter环境下请求与展示插全屏广告

插屏广告是移动广告的一种常见形式,在应用开流程中弹出,当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。

提示

2.4.161版本起,插屏与全屏广告统一为插屏广告,旧版本的全屏广告需要修改调用方式

插全屏广告请求

提示

调用加载并展示时,不需要额外判断广告加载情况和处理预加载广告对象过期后重新请求的问题。

需要屏蔽用户的重复点击操作,防止用户频繁点击导致的广告嵌套播放

调用ZJAndroid.interstitial方法请求插全屏广告

class ZJAndroid {
  /// 插全屏
  static void interstitial(
    /// 广告位ID
    String posId, {
    /// 用户ID,选填
    String userId = "",

    /// 是否开启视频声音
    bool videoSoundEnable = true,

    /// 是否为预加载,默认false
    /// 非预加载时,加载成功后直接播放
    /// 预加载时仅回调成功/失败,需要搭配[showInterstitial]方法展示
    bool isPreLoad = false,

    /// FLAGS
    int flags = 0,

    /// 回调。具体事件见 example
    Function(ZJEvent ret)? interstitialListener,
  });
}

插全屏广告回调说明

ret.action说明
ZJEventAction.onAdError广告展示失败
ret.code:错误码,非错误事件为0
ret.msg:错误信息,非错误事件为空字符串
ZJEventAction.onAdShow广告展示成功
ZJEventAction.onAdClick广告点击
ZJEventAction.onAdClose广告关闭

插全屏广告展示

提示

激励广告为耗时操作,建议在增加时增加一个加载提示对话框

example/lib/ad/interstitial.dart
/// 加载并展示插屏广告
void _interstitial(String posId) {
  setState(() {
    isRequesting = true;
  });
  ZJAndroid.interstitial(
      // 广告位ID
      posId,
      // 视频类素材是否开启声音,默认true
      videoSoundEnable: true, 
      interstitialListener: (ret) {
        switch (ret.action) {
          // 广告错误
          case ZJEventAction.onAdError:
            Fluttertoast.showToast(msg: "插屏错误:${ret.msg}");
            if (kDebugMode) {
              print("${ret.action}:${ret.code}-${ret.msg}");
            }
            _reset();
            break;
          // 展示成功
          case ZJEventAction.onAdShow:
            Fluttertoast.showToast(msg: "插屏展示");
            break;
          // 点击广告
          case ZJEventAction.onAdClick:
            Fluttertoast.showToast(msg: "插屏点击");
            break;
          // 关闭
          case ZJEventAction.onAdClose:
            Fluttertoast.showToast(msg: "插屏关闭");
            _reset();
            break;
          default:
            // ignore
        }
  });
}

插全屏广告预加载

提示

广告的请求行为与展示行为是对应关系,即一次请求对应一次展示,重复展示时会报错

预加载广告的有效时间为20分钟,过期后展示会回调错误,需要重新请求

预加载对于Flutter全局缓存一个对象,不需要在每个页面去单独预加载。可以重复预加载广告,新返回的广告对象会替换旧对象

example/lib/ad/interstitial.dart
  /// 预加载插全屏
  void _preloadInterstitialAd() {
    ZJAndroid.interstitial(
        _isInterstitial
            ? TestPosId.interstitialPosId
            : TestPosId.fullScreenVideoPosId,
        userId: TestPosId.testUserId,
        // FLAGS
        flags: ZJFlags.FLAG_IGNORE_CONFIG_ERROR,
        isPreLoad: true, interstitialListener: (ret) {
      // 预加载仅回调加载失败和加载成功
      switch (ret.action) {
        // 广告出错
        case ZJEventAction.onAdError:
          _reset(context);
          Fluttertoast.showToast(msg: "插全屏广告错误:${ret.msg}");
          if (kDebugMode) {
            print("${ret.action}:${ret.code}-${ret.msg}");
          }
          break;
        // 加载成功
        case ZJEventAction.onAdLoaded:
          _reset(context);
          Fluttertoast.showToast(msg: "插全屏广告加载成功");
          break;
        default:
          break;
      }
    });
  }
  
  /// 展示插全屏
  /// 仅预加载时需要手动调用展示方法
  /// 需要预加载请求回调[ZJEventAction.onAdLoaded]调用,否则回调错误
  /// 预加载状态全局生效,有效期20分钟,过期时会在播放时回调错误
  void _showInterstitialAd() {
    ZJAndroid.showInterstitial((ret) {
      switch (ret.action) {
        // 广告出错
        case ZJEventAction.onAdError:
          _reset(context);
          Fluttertoast.showToast(msg: "插全屏广告错误:${ret.msg}");
          if (kDebugMode) {
            print("${ret.action}:${ret.code}-${ret.msg}");
          }
          break;
        // 展示成功
        case ZJEventAction.onAdShow:
          Fluttertoast.showToast(msg: "插全屏广告展示");
          break;
        // 点击广告
        case ZJEventAction.onAdClick:
          Fluttertoast.showToast(msg: "插全屏广告点击");
          break;
        // 关闭
        case ZJEventAction.onAdClose:
          Fluttertoast.showToast(msg: "插全屏广告关闭");
          break;
        default:
        // ignore
      }
    });
  }