Размещение баннера Unity Admob внизу на устройстве с вырезом дисплея - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь расположить свой рекламный баннер (созданный с помощью официального пакета Admob для Unity) в самом низу экрана, но, похоже, он не очень хорошо работает с устройствами с надрезом.

bv = new BannerView(adUnitId, adSize, AdPosition.Bottom);

Эта строка кода идеально позиционирует баннер в самом низу на устройствах без надрезов (таких как Pixel, Pixel XL, Pixel 2 и 2 XL), но выглядит так, когда устройство имеет надрез сверху:

enter image description here

(Демонстрационная фотография взята с этого выпуска Github . Игнорировать видимую панель навигации.)

расстояние между баннером и нижней частью экрана составляет точно высота надреза. Я проверил это с несколькими высотами надреза.

Чтобы разместить баннер в самом низу, я думаю, что лучшее решение - это получить высоту надреза, а затем использовать следующую строку кода:

new BannerView(adUnitId, adSize, 0, (int)ConvertPixelsToDP(Screen.height - adHeight + notchHeight));

Но я не мог найти способ получить высоту выреза. Я попытался использовать свойства классов Screen и Display, но ни один из способов не помог мне получить реальное разрешение экрана, включая выемку, поэтому я мог вычесть высоту safeArea - и получить точную высоту отметки.

Есть ли способ получить это реальное разрешение экрана? или любое другое возможное решение этой проблемы?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Начиная с основной ветки выпуска GitHub об этом разработчики плагинов AdMob Unity заявили: «В следующем выпуске будет определена приоритетность совместимости надрезов». еще в октябре, отметив, что они знают об ошибке, и они опубликовали 22 января сообщение «Эта работа была отложена, но она будет включена в следующий выпуск. Пока нет никаких ETA, но это должно произойти в ближайшее время». Итак, кто знает, когда проблема когда-нибудь будет решена.

Но для всех, кто борется с этой проблемой: я нашел обходной путь. В моем случае это обходной путь для показа объявления внизу экрана, но я также упомяну, как его можно правильно отобразить вверху. Я все еще надеюсь на выпуск, который скоро исправит это, но есть вариант для тех, кто не хочет ждать ...

Я нашел этот обходной путь, потому что сначала начал с очевидного решения: вычислите позицию y вручную по очевидной формуле: int yDP = DensityIndependentPixels(Mathf.RoundToInt(Screen.safeArea.y + Screen.safeArea.height) - ScreenPixels(adSize.Height)); Это будет работать, за исключением того факта, что с Unity 2018.3.5 safeArea всегда имеет 0 , 0 для x и y, и в то время как ширина и высота могут использоваться для определения наличия метки по сравнению с Display.main.systemHeight (хотя, насколько я могу судить, Screen.height == safeArea.height и то же самое для width, поэтому safeArea сейчас совершенно бесполезен, так как он передает только информацию, которую вы можете получить из Screen.height и Screen.width), вы не можете определить, где находится метка ... это означает, что в этом обходном пути я предполагаю, что метка находится на верхняя часть экрана (безопасное предположение, но в некоторых телефонах есть две метки, одна сверху и одна снизу, и для этих устройств мой обходной путь оставит рекламу частично закрытой нижней меткой ... если safeArea когда-либо станет полезным значения, мой обходной путь может объяснить это ... в любом случае, я отвлекся.) ...

С этим предположением мы можем использовать слегка измененную формулу: int yDP = DensityIndependentPixels(Screen.height - ScreenPixels(adSize.Height));

Но, к сожалению, пока я регистрировал значения, я ожидал, что для позиции y ... она все еще обнаруживалась в той же странной позиции смещения! Я начал вручную увеличивать позицию y с 0 постепенно и подтвердил, что при определенной координате y, даже если вы увеличите значение, позиция, в которой оно появится, будет такой же! А потом я обнаружил, что если вы добавите чуть больше к значению y, это необъяснимым образом выскочит вверх в верхней части экрана, и вы могли бы продолжать увеличивать позицию y, чтобы вернуть его обратно на экран, за исключением того времени, когда это не не застрять в странной позиции смещения! После долгих экспериментов я обнаружил, что формула для этого необъяснимого дополнительного смещения y по кругу: (DensityIndependentPixels(Display.main.systemHeight) + adSize.Height), а при добавлении к intendedDensityIndependentPixelPosition ... теперь у вас есть баннер в позиции y, которую вы ожидали!

Как только вы упростите математику, ручная позиция y, которая является функциональным обходным путем для размещения баннера внизу на надрезанном устройстве, будет шокирующе простой:

int yDP = DensityIndependentPixels(Screen.height + Display.main.systemHeight);

Я проверил это на всех имитированных надрезах в Android 9, и это работает (с оговоркой, что двойная насечка частично покрывает рекламу, но это лучше, чем реклама, покрывающая пользовательский интерфейс приложения), но будьте осторожны что я еще не проверял это на реальных устройствах с надрезом!

Обратите внимание, что вам нужно делать это только тогда, когда Screen.height != Display.main.systemHeight ... в противном случае вы используете устройство без зазубрин и должны использовать AdPosition.BOTTOM.

Для тех, кто хочет, чтобы ваш баннер отображался вверху, ручной расчет для y позиции еще проще. При том же предположении, что вырезы всегда находятся сверху, позиция y объявления должна быть установлена ​​на DensityIndependentPixels(Display.main.systemHeight - Screen.height) без какого-либо причудливого необъяснимого смещения обтекания. Обратите внимание, что я не проверял отображение баннера вверху, поскольку баннер в моем приложении всегда отображается внизу.

Ручная формула x позиции, чтобы убедиться, что объявление центрировано точно так, как вы ожидаете: int xDP = Mathf.RoundToInt(DensityIndependentPixels(Display.main.systemWidth - ScreenPixels(adSize.Width)) / 2f); Ничего особенно странного там нет.

И последнее замечание. Я заметил, что после того, как я начал вручную указывать позицию объявления, я не мог позвонить Show() после вызова Hide() на BannerView ... он бы оказался в странном состоянии, где он был невидимый, но кликабельный; чтобы исправить это просто Destroy() и создать новый AdRequest вместо вызова Show() ... Я видел некоторые заявления на форумах поддержки Google, которые говорят, что в любом случае это лучше.

Надеюсь, день, когда я потерял погружение в эту причудливую проблему, и найти этот обходной путь кому-то здесь поможет.

0 голосов
/ 07 декабря 2018

К сожалению, это проблема, вызванная тем, что admob неправильно учитывает высшую ступеньку Android.Обратите внимание, что в iOS рекламный код, по-видимому, подтверждает существование выемки и добавляет под нее 10 дополнительных отступов, что странно.

Я потратил день или около того, пытаясь выяснить очень похожую проблему сbanner.

Есть несколько способов исправить это:

Вариант 1. Создайте новый плагин Java и добавьте код ниже или из C # вызовите эквивалент этого кода:

public int getDisplayRealHeightPixels() {
    Point realSize = new Point();
    Display display = getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= 17) {
        display.getRealSize(realSize);
    }
    else {
        display.getSize(realSize);
    }
    return realSize.y;
}

Затем используйте getDisplayRealHeightPixels() для размещения баннера.Вот что я сейчас делаю.

Вариант 2. Включите рисование в вырезанной области: создайте новый плагин Java, в onCreate добавьте:

protected void onCreate(Bundle savedInstanceState) {
    ...
    // uncomment to allow painting in notch area;
    WindowManager.LayoutParams attributes = getWindow().getAttributes();
    attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
    getWindow().setAttributes(attributes);
    ...

Я буду использоватьэта опция, как только я адаптирую свое приложение для правильной поддержки вырезов.

Опция 3: дождитесь, пока Unity 2018.3 правильно поддержит метки

В соответствии с https://unity3d.com/unity/beta/2018.3:

"Android: добавлена ​​поддержка надреза для Android."


Получено:

  1. Ни одно из вышеуказанных исправлений не является идеальным (возможно, вариант 3? Но я не пробовалэто.) Убедитесь, что тестировали на iOS (iPhone X), потому что там реклама ведет себя иначе, чем на Android.
  2. На рекламе на Android y == 0 - верхняя часть экрана, а на iPhone X y == 0визуализирует баннер примерно на 10 единиц ниже метки.Для iOS я просто жестко кодирую «размер надреза» до 30 и рисую свое приложение в области надреза.
  3. Разделение экрана Android - это боль - я не проверил там полностью, мой баннер развевается по экрану в этомдело.Я просто решил исправить это позже.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...