SDK_UnityMoney/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/Utils/AdmobUtils.cs

125 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Linq;
using System.Reflection;
using GoogleMobileAds.Api;
using Script.Utils;
using UnityEngine;
namespace Script.SDKManager.AdsSDKManager.AdmobAdsManager.Utils
{
public class AdmobUtils
{
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;
}
}
}