| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |  | using System; | 
					
						
							|  |  |  |  | using System.Linq; | 
					
						
							|  |  |  |  | using System.Reflection; | 
					
						
							|  |  |  |  | using GoogleMobileAds.Api; | 
					
						
							|  |  |  |  | using UnityEngine; | 
					
						
							| 
									
										
										
										
											2025-08-31 08:26:53 +00:00
										 |  |  |  | using Newtonsoft.Json.Linq; | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  | namespace WZ | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |  | { | 
					
						
							|  |  |  |  |     public class AdmobUtils | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-31 08:26:53 +00:00
										 |  |  |  |         public static string ParseResponseInfo(ResponseInfo responseInfo) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             string pubid = ""; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             try | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 string responseInfoJson = responseInfo.ToString(); | 
					
						
							|  |  |  |  |                 JObject responseInfoObj = JObject.Parse(responseInfoJson); | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |                 JToken loadedAdapterResponse = responseInfoObj["Response Extras"]; | 
					
						
							| 
									
										
										
										
											2025-08-31 08:26:53 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |                 if (loadedAdapterResponse != null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |                     pubid = loadedAdapterResponse["mediation_group_name"]?.ToString(); | 
					
						
							| 
									
										
										
										
											2025-08-31 08:26:53 +00:00
										 |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-09-01 15:57:41 +00:00
										 |  |  |  |             catch | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 08:26:53 +00:00
										 |  |  |  |             return pubid; | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-09-01 15:57:41 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |  |         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); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 15:57:41 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static double GetNativeEcpm(NativeOverlayAd ad) | 
					
						
							|  |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-09-02 07:56:24 +00:00
										 |  |  |  |             return GetEcpm(ad, "nativeOverlayAd", "nativeAd", NaStack); | 
					
						
							| 
									
										
										
										
											2025-09-01 15:57:41 +00:00
										 |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |  |         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" }; | 
					
						
							| 
									
										
										
										
											2025-09-04 06:24:18 +00:00
										 |  |  |  |         private static readonly string[] SpStack = { "zzb", "zza", "zzc", "zza", "zzk", "zzae" }; | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |  |         private static readonly string[] IvStack = { "zzc", "zzj", "zzf", "zzd", "zzae" }; | 
					
						
							|  |  |  |  |         private static readonly string[] RvStack = { "zzb", "zzi", "zze", "zze", "zzae" }; | 
					
						
							| 
									
										
										
										
											2025-09-02 07:56:24 +00:00
										 |  |  |  |         private static readonly string[] NaStack = { "zza", "zzb", "zzf", "zzD", "zzb", "zzae" }; | 
					
						
							| 
									
										
										
										
											2025-08-30 13:48:51 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 获取java ad view 对象 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="o">unity admob 实例化对象</param> | 
					
						
							|  |  |  |  |         /// <param name="cShapeFieldName">unity 引用 java 桥阶层的属性名</param> | 
					
						
							|  |  |  |  |         /// <param name="javaFieldName">java桥阶层,持有ad对象的方法名</param> | 
					
						
							|  |  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |  |         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<AndroidJavaObject>(javaFieldName); | 
					
						
							|  |  |  |  |             if (javaAdViewOjb == null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 throw new NullReferenceException("java obj is null ; " + cShapeFieldName + "\t " + javaFieldName); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             return javaAdViewOjb; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 获取 admob 的 AdValue 对象 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="obj">admob 广告对象</param> | 
					
						
							|  |  |  |  |         /// <param name="stack">内存位置</param> | 
					
						
							|  |  |  |  |         /// <returns>AdValue 的对象</returns> | 
					
						
							|  |  |  |  |         private static AndroidJavaObject GetAdValue(AndroidJavaObject obj, string[] stack) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             return stack.Aggregate(obj, (current, field) => | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 var androidJavaObject = current.Get<AndroidJavaObject>(field); | 
					
						
							|  |  |  |  |                 if (androidJavaObject == null) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     throw new NullReferenceException("androidJavaObject is null ; " + current + "\t " + field); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 return androidJavaObject; | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 获取 ecpm | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="obj">admob AdValue对象</param> | 
					
						
							|  |  |  |  |         /// <returns>广告收益</returns> | 
					
						
							|  |  |  |  |         private static double GetEcpm(AndroidJavaObject obj) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             return obj.Get<long>("zzd") * 1.0 / 1000000; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |