143 lines
5.2 KiB
C#
143 lines
5.2 KiB
C#
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);
|
||
}
|
||
|
||
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", "zzi", "zze", "zze", "zzae" };
|
||
private static readonly string[] IvStack = { "zzc", "zzj", "zzf", "zzd", "zzae" };
|
||
private static readonly string[] RvStack = { "zzb", "zzi", "zze", "zze", "zzae" };
|
||
|
||
|
||
/// <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;
|
||
}
|
||
}
|
||
} |