如何在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
相关产品推荐
相关产品推荐

