繁体   English   中英

Unity AdMob-ClassNotFound:com.google.unity.ads.UnityAdListener

[英]Unity AdMob - ClassNotFound: com.google.unity.ads.UnityAdListener

尝试通过AdMob for Unity加载或显示插页式广告时,我的应用出现以下错误: ClassNotFoundException: com.google.unity.ads.UnityAdListener

AndroidJavaException: java.lang.ClassNotFoundException: com.google.unity.ads.UnityAdListener
java.lang.ClassNotFoundException: com.google.unity.ads.UnityAdListener
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:453)
    at java.lang.Class.forName(Class.java:378)
    at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
    at com.unity3d.player.UnityPlayer.c(Unknown Source:0)
    at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:72)
    at android.os.MessageQueue.next(MessageQueue.java:394)
    at android.os.Looper.loop(Looper.java:142)
    at com.unity3d.player.UnityPlayer$e.run(Unknown Source:32)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.unity.ads.UnityAdListener"

我的主要广告代码是:

public class AdsTest : MonoBehaviour
{
  private InterstitialAd interstitial;

  public void LoadAd()
  {
    string adUnitId = "ca-app-pub-3940256099942544/1033173712";
    interstitial = new InterstitialAd(adUnitId);

    interstitial.OnAdLoaded += HandleOnAdLoaded;
    interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad;
    interstitial.OnAdOpening += HandleOnAdOpened;
    interstitial.OnAdClosed += HandleOnAdClosed;
    interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication;

    AdRequest request = new AdRequest.Builder().Build();
    interstitial.LoadAd(request);
  }

  public void ShowAd()
  {
    if (interstitial.IsLoaded())
    {
        interstitial.Show();
    }
  }
  ...
}

AdsTest类的其余部分是标准事件void(OnAdLoaded,OnAdClosed等),与Google文档中的相同

从另一个类调用广告脚本:

void OnTriggerEnter2D(Collider2D trigger)
{
    ReturnToStart();
    // where ads is a instance of the AdsTest class
    // ads = new AdsTest();
    ads.LoadAd();
    ads.ShowAd();
}

我已经在游戏开始时在控制器对象中初始化了AdMob ID。

// executed when the app starts
string appId = "ca-app-pub-3522556458609123~3670809634";
MobileAds.Initialize(appId);

我已经从unity-package中导入了所有资产,并强制解决了play服务的依赖关系。

我的AndroidManifest看起来也像这样:

截图

环境和版本控制:

Unity-Windows 10 x64的2018.3.0f2 Personal

Android SDK-27

AdMob插件-v3.15.1 (从Github下载)

java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) Client VM (build 25.191-b12, mixed mode, sharing)

播放服务-通过Admob软件包安装

在Android 8.1,API 27上测试

仿真器规格

我认为某些依赖项存在冲突,并且在依赖项解析器修复它们的同时,ProGuard甚至使事情更加混乱。 这是我解决此特定问题的方法:

  • 转到构建设置>播放器设置>发布设置( 播放器设置docs )。
  • 启用自定义ProGuard配置。
  • 配置proguard文件以解决您的问题。 在我这边,下面的代码段可以完成这项工作。 但是,如果您使用其他依赖项,则它们可能与此配置冲突。 在这种情况下,需要更多尝试才能失败,直到显示正确的配置… ProGuard docs
-keep class com.google.unity.** {
   *;
}
-keep public class com.google.android.gms.ads.**{
   public *;
}
-keep public class com.google.ads.**{
   public *;
}
-keepattributes *Annotation*
-dontobfuscate

有关更多详细信息,请参阅我撰写的有关此问题的博客文章

注意:在具有最新版本的AdMob和Android SDK的最新项目中,没有出现此问题。 (截至2019年5月)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM