using System; using System.Linq; using System.Reflection; using GoogleMobileAds.Api; using UnityEngine; using Newtonsoft.Json.Linq; namespace WZ { public class AdmobUtils { public static string ParseResponseInfo(ResponseInfo responseInfo) { string pubid = ""; try { string responseInfoJson = responseInfo.ToString(); JObject responseInfoObj = JObject.Parse(responseInfoJson); JToken loadedAdapterResponse = responseInfoObj["Response Extras"]; if (loadedAdapterResponse != null) { pubid = loadedAdapterResponse["mediation_group_name"]?.ToString(); } } catch { } return pubid; } public static double GetBannerEcpm(BannerView bannerView) { return GetEcpm(bannerView, "bannerView", "adView", BannerStack); } public static double GetRewardedAdEcpm(RewardedAd rewardedAd) { return GetEcpm(rewardedAd, "androidRewardedAd", "rewardedAd", RvStack); } public static double GetInterstitialAdEcpm(InterstitialAd interstitialAd) { return GetEcpm(interstitialAd, "androidInterstitialAd", "interstitialAd", IvStack); } public static double GetAppOpenAdEcpm(AppOpenAd appOpenAd) { return GetEcpm(appOpenAd, "androidAppOpenAd", "appOpenAd", SpStack); } public static double GetNativeEcpm(NativeOverlayAd ad) { return GetEcpm(ad, "nativeOverlayAd", "nativeAd", NaStack); } private static double GetEcpm(object o, string cShapeFieldName, string javaFieldName, string[] stack) { try { return GetEcpm(GetAdValue(GetJavaAdViewOjb(o, cShapeFieldName, javaFieldName), stack)); } catch (Exception e) { LoggerUtils.Error("[AdmobTools] e : " + e.Message + "\t cShapeFieldName : " + cShapeFieldName); } return -1; } private static readonly string[] BannerStack = { "zza", "zzj", "zzi", "zze", "zza", "zzk", "zzae" }; private static readonly string[] SpStack = { "zzb", "zza", "zzc", "zza", "zzk", "zzae" }; private static readonly string[] IvStack = { "zzc", "zzj", "zzf", "zzd", "zzae" }; private static readonly string[] RvStack = { "zzb", "zzi", "zze", "zze", "zzae" }; private static readonly string[] NaStack = { "zza", "zzb", "zzf", "zzD", "zzb", "zzae" }; /// /// 获取java ad view 对象 /// /// unity admob 实例化对象 /// unity 引用 java 桥阶层的属性名 /// java桥阶层,持有ad对象的方法名 /// private static AndroidJavaObject GetJavaAdViewOjb(object o, string cShapeFieldName, string javaFieldName) { if (o == null) { throw new NullReferenceException("adView is null ; " + cShapeFieldName + "\t " + javaFieldName); } var type = o.GetType(); // 获取 BannerView 类型 var fieldInfo = type.GetField("_client", BindingFlags.NonPublic | BindingFlags.Instance); // 获取 _client 字段信息 if (fieldInfo == null) { throw new NullReferenceException("fieldInfo is null ; " + cShapeFieldName + "\t " + javaFieldName); } var client = fieldInfo.GetValue(o); // 获取 _client 字段的值 var clientType = client.GetType(); var bannerViewFieldInfo = clientType.GetField(cShapeFieldName, BindingFlags.NonPublic | BindingFlags.Instance); if (bannerViewFieldInfo == null) { throw new NullReferenceException("cShapeFieldName fieldInfo is null ; " + cShapeFieldName + "\t " + javaFieldName); } var bannerViewAndroidJavaObject = (AndroidJavaObject)bannerViewFieldInfo.GetValue(client); var javaAdViewOjb = bannerViewAndroidJavaObject.Get(javaFieldName); if (javaAdViewOjb == null) { throw new NullReferenceException("java obj is null ; " + cShapeFieldName + "\t " + javaFieldName); } return javaAdViewOjb; } /// /// 获取 admob 的 AdValue 对象 /// /// admob 广告对象 /// 内存位置 /// AdValue 的对象 private static AndroidJavaObject GetAdValue(AndroidJavaObject obj, string[] stack) { return stack.Aggregate(obj, (current, field) => { var androidJavaObject = current.Get(field); if (androidJavaObject == null) { throw new NullReferenceException("androidJavaObject is null ; " + current + "\t " + field); } return androidJavaObject; }); } /// /// 获取 ecpm /// /// admob AdValue对象 /// 广告收益 private static double GetEcpm(AndroidJavaObject obj) { return obj.Get("zzd") * 1.0 / 1000000; } } }