You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi 11.0中创建插屏广告?旧版本代码失效求助

Delphi 11.0 插屏广告(Interstitial Ads)适配方案

你的旧代码失效是因为Delphi 11适配了Google Mobile Ads SDK 20.x+,该版本废弃了旧的JIAdListener接口和TJInterstitialAd.init初始化方式,改用全新的Builder模式与拆分式回调接口。以下是适配后的完整实现:

核心修改点

  • 废弃旧的JIAdListener,拆分出加载回调(JInterstitialAdLoadCallback)和全屏内容回调(JFullScreenContentCallback)
  • 替换TJInterstitialAd.init为TJInterstitialAd_Builder构建模式
  • 移除无用的TJAdListenerAdapter,直接实现新的回调接口

完整代码实现

1. 回调类定义

unit AdMobInterstitial;

interface

uses
  Androidapi.JNI.JavaTypes, Androidapi.JNI.GoogleAds, Androidapi.JNI.AdMob,
  Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText;

type
  TInterstitialLoadCallback = class(TJavaLocal, JInterstitialAdLoadCallback)
  private
    FOnAdLoaded: TProc<JInterstitialAd>;
    FOnAdFailed: TProc<Integer>;
  public
    constructor Create(AOnAdLoaded: TProc<JInterstitialAd>; AOnAdFailed: TProc<Integer>);
    procedure onAdLoaded(ad: JInterstitialAd); cdecl;
    procedure onAdFailedToLoad(loadAdError: JLoadAdError); cdecl;
  end;

  TInterstitialContentCallback = class(TJavaLocal, JFullScreenContentCallback)
  private
    FOnAdShowed: TProc;
    FOnAdDismissed: TProc;
    FOnAdFailed: TProc<JAdError>;
  public
    constructor Create(AOnShowed, AOnDismissed: TProc; AOnFailed: TProc<JAdError>);
    procedure onAdShowedFullScreenContent; cdecl;
    procedure onAdDismissedFullScreenContent; cdecl;
    procedure onAdFailedToShowFullScreenContent(adError: JAdError); cdecl;
  end;

implementation

{ TInterstitialLoadCallback }

constructor TInterstitialLoadCallback.Create(AOnAdLoaded: TProc<JInterstitialAd>; AOnAdFailed: TProc<Integer>);
begin
  inherited Create;
  FOnAdLoaded := AOnAdLoaded;
  FOnAdFailed := AOnFailed;
end;

procedure TInterstitialLoadCallback.onAdLoaded(ad: JInterstitialAd);
begin
  if Assigned(FOnAdLoaded) then
    FOnAdLoaded(ad);
end;

procedure TInterstitialLoadCallback.onAdFailedToLoad(loadAdError: JLoadAdError);
begin
  if Assigned(FOnAdFailed) then
    FOnAdFailed(loadAdError.getCode);
end;

{ TInterstitialContentCallback }

constructor TInterstitialContentCallback.Create(AOnShowed, AOnDismissed: TProc; AOnFailed: TProc<JAdError>);
begin
  inherited Create;
  FOnAdShowed := AOnShowed;
  FOnAdDismissed := AOnDismissed;
  FOnAdFailed := AOnFailed;
end;

procedure TInterstitialContentCallback.onAdShowedFullScreenContent;
begin
  if Assigned(FOnAdShowed) then
    FOnAdShowed;
end;

procedure TInterstitialContentCallback.onAdDismissedFullScreenContent;
begin
  if Assigned(FOnAdDismissed) then
    FOnAdDismissed;
end;

procedure TInterstitialContentCallback.onAdFailedToShowFullScreenContent(adError: JAdError);
begin
  if Assigned(FOnAdFailed) then
    FOnAdFailed(adError);
end;

end.

2. 广告加载与显示逻辑

在主窗体或相关模块中调用:

uses
  ..., AdMobInterstitial, Androidapi.JNI.GoogleAds;

var
  FInterstitialAd: JInterstitialAd;

procedure LoadInterstitialAd;
var
  LAdRequest: JAdRequest;
  LLoadCallback: TInterstitialLoadCallback;
begin
  // 构建广告请求
  LAdRequest := TJAdRequest_Builder.JavaClass.build;

  // 创建加载回调
  LLoadCallback := TInterstitialLoadCallback.Create(
    procedure(Ad: JInterstitialAd)
    var
      LContentCallback: TInterstitialContentCallback;
    begin
      // 保存广告实例
      FInterstitialAd := Ad;
      // 设置全屏内容回调
      LContentCallback := TInterstitialContentCallback.Create(
        procedure // 广告显示成功
        begin
          // 可添加统计或UI更新逻辑
        end,
        procedure // 广告关闭
        begin
          FInterstitialAd := nil;
          // 可选:立即加载下一条广告
          // LoadInterstitialAd;
        end,
        procedure(Error: JAdError) // 广告显示失败
        begin
          FInterstitialAd := nil;
        end
      );
      Ad.setFullScreenContentCallback(LContentCallback);
    end,
    procedure(ErrorCode: Integer) // 广告加载失败
    begin
      case ErrorCode of
        TJLoadAdError.JavaClass.INTERNAL_ERROR: ShowMessage('内部错误');
        TJLoadAdError.JavaClass.INVALID_REQUEST: ShowMessage('无效请求');
        TJLoadAdError.JavaClass.NETWORK_ERROR: ShowMessage('网络错误');
        TJLoadAdError.JavaClass.NO_FILL: ShowMessage('无广告填充');
      end;
    end
  );

  // 在UI线程加载广告
  CallInUIThread(
    procedure
    begin
      TJInterstitialAd.JavaClass.loadAd(
        TAndroidHelper.Context,
        StringToJString('ca-app-pub-3940256099942544/1033173712'), // 测试ID,替换为你的正式ID
        LAdRequest,
        LLoadCallback
      );
    end
  );
end;

// 显示广告(需先确认FInterstitialAd不为空且isReady)
procedure ShowInterstitialAd;
begin
  if Assigned(FInterstitialAd) and FInterstitialAd.isReady then
    CallInUIThread(
      procedure
      begin
        FInterstitialAd.show(TAndroidHelper.Activity);
      end
    );
end;

额外注意事项

  • 权限配置:确保AndroidManifest.xml中添加以下权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • 应用ID配置:在AndroidManifest.xml的<application>标签内添加:
    <meta-data
        android:name="com.google.android.gms.ads.APPLICATION_ID"
        android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy" /> <!-- 替换为你的应用ID -->
    
  • 测试ID:开发阶段请使用Google提供的测试广告ID,避免触发广告平台限制。

内容的提问来源于stack exchange,提问作者sn_na_v

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:24:54