Если плагин Яндекса не предоставляет информацию о высоте баннера, это не значит, что мы не можем её получить. Для этого нужно использовать Android Java Native Interface и Java Reflection
Заглянем в код Yandex Mobile Ads Unity Plugin. Баннер представлен Java классом
com.yandex.mobile.ads.unity.wrapper.banner.BannerAdWrapperЭто класс из библиотеки yandex-ads-unity-plugin.aar. Идём в
Assets\Plugins\Android и находим там эту библиотеку. Распаковываем этот aar архив, внутри лежит файл classes.jar, распаковываем и его тоже. Это скомпилированные java классы. Закидываем их в декомпилятор (в моём случае просто открываю папку в Intellij IDEA). Видим вот такую картину:public class BannerAdWrapper {
...
private final a<BannerAdView> d;
...
}
public class a<T> {
...
public T a() {
if (this.b == null) {
this.b = this.a.a();
}
return this.b;
}
...
}Красивые названия классов и методов от нас спрятали, но ничего страшного. Вполне можно понять, что непосредственно сам BannerAdView можно получить, вызвав у поля d класса BannerAdWrapper метод a().
Окей, супер. Из Unity это делается следующим образом:
public static AndroidJavaObject GetBannerView(AndroidJavaObject bannerViewWrapper)
{
using var javaClass = new AndroidJavaClass("java.lang.Class");
using var clazz = javaClass.CallStatic<AndroidJavaObject>("forName", "com.yandex.mobile.ads.unity.wrapper.banner.BannerAdWrapper");
using var field = clazz.Call<AndroidJavaObject>("getDeclaredField", "d");
field.Call("setAccessible", true);
return field.Call<AndroidJavaObject>("get", bannerViewWrapper).Call<AndroidJavaObject>("a");
}
Осталось только узнать, как получить высоту у этого BannerAdView. Это класс из библиотеки com.yandex.android:mobileads. Лезем в mvnrepository, скачиваем aar архив и также декомпилируем классы. Эти классы написаны уже на Котлине, и мы не можем посмотреть код методов, но это нам и не нужно. Зато мы видим, что
class BannerAdView : com.yandex.mobile.ads.impl.si0
и
import android.widget.RelativeLayout;
public abstract class si0 extends RelativeLayout
соответственно наш
BannerAdView наследуется от android.widget.RelativeLayout. Идём в документацию и видим, что у этого класса, а вернее у его предка android.view.View есть метод int getHeight().Готово. Значит мы можем при срабатывании события
banner.OnAdLoaded определять высоту загруженного баннера (технически высоту View, в котором он отрисовывается), с помощью кодаGetBannerView(bannerView).Call<int>("getHeight")Яндекс, добавьте, пожалуйста, информацию о высоте баннера в SDK, это позволит делать более красивые интерфейсы, и не городить такие жуткие костыли. Либо также через геттер, либо в аргументы события
banner.OnAdLoaded.#самый_крутяк #тайные_знания #рся