Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android.
Может быть, эта информация кому-нибудь поможет
В документации Android высота баннера должна вычисляться так:
Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом:
const
AdHeightPortrait = 90;
AdHeightLandscape = 90;
AdHeightPhonePortrait = 50;
AdHeightPhoneLandscape = 32;
AndroidSW600DP = 600;
AndroidSW600DPLandscape = 552;
AdMobBannerHeight = 50;
AdMobFullBannerHeight = 60;
AdMobLeaderboardHeight = 90;
begin
if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then
begin
case FAdControl.AdSize of
TBannerAdSize.Auto:
begin
if Screen.Size.Height > Screen.Size.Width then
if Screen.Size.Width < AndroidSW600DP then
FAdControl.Height := AdHeightPhonePortrait
else
FAdControl.Height := AdHeightPortrait
else
if Screen.Size.Height < AndroidSW600DPLandscape then
FAdControl.Height := AdHeightPhoneLandscape
else
FAdControl.Height := AdHeightLandscape;
end;
Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким:
procedure TAndroidBannerAd.UpdateControlMetrics;
var
Frame: TRectF;
Form: TCommonCustomForm;
Disp: JDisplayMetrics;
Window: JWindow;
h: integer;
const
AdHeightLandscape = 90;
AdHeightPhoneLandscape = 32;
AndroidSW600DP = 600;
AndroidSW600DPLandscape = 552;
AdMobBannerHeight = 50;
AdMobFullBannerHeight = 60;
AdMobLeaderboardHeight = 90;
begin
if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then
begin
Disp := TJDisplayMetrics.Create;
Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID);
Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp);
h:=round(Disp.heightPixels/Disp.density);
case FAdControl.AdSize of
TBannerAdSize.Auto:
begin
if Screen.Size.Height > Screen.Size.Width then begin
if h <= 400 then FAdControl.Height := 32
else if (h>400) and (h<=720) then FAdControl.Height:=50
else FAdControl.Height := 90
end
else
if Screen.Size.Height < AndroidSW600DPLandscape then
FAdControl.Height := AdHeightPhoneLandscape
else
FAdControl.Height := AdHeightLandscape;
end;
TBannerAdSize.Small:
FAdControl.Height := AdMobBannerHeight;
TBannerAdSize.Medium:
FAdControl.Height := AdMobFullBannerHeight;
TBannerAdSize.Large:
FAdControl.Height := AdMobLeaderboardHeight;
end;
if Screen.ActiveForm <> nil then
Form := Screen.ActiveForm
else if Application.MainForm <> nil then
Form := Application.MainForm
else
Form := nil;
if Form <> nil then
begin
Frame := WindowHandleToPlatform(Form.Handle).Bounds;
FAdControl.Width := Round(Frame.Width);
end;
end;
end;