Ошибка списка пользователей службы Google Play при использовании Unity 2018 (java.lang.ClassNotFoundException: com.google.games.bridge.TokenFragment)

Я хочу реализовать Leaderboard в своем мобильном Android-приложении, используя Unity.

Я использую:

  • Unity 2018.2.18f1 (Mac)

  • Комплект разработчика Java (jdk.1.8.0_191)

  • Google Play Games Plugin 0.9.57 [текущая версия 1.1.2019]

Сервисы Google Play активируются успешно (покупки в приложении работают отлично), но я продолжаю получать эту ошибку при попытке включить функцию списка лидеров:

java.lang.ClassNotFoundException: com.google.games.bridge.TokenFragment

Далее (чтобы было понятно: я заменил название приложения на XXXX):

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.games.bridge.TokenFragment" on path: DexPathList[[zip file "/data/app/com.NGDD.XXXX-1/base.apk"],nativeLibraryDirectories=[/data/app/com.NGDD.XXXX-1/lib/arm, /data/app/com.NGDD.XXXX

а также

2019-01-01 17:48:52.784 15145-15145/com.NGDD.XXXX W/System: ClassLoader referenced unknown path: /system/framework/QPerformance.jar
2019-01-01 17:48:52.785 15145-15145/com.NGDD.XXXX E/BoostFramework: BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib, /vendor/lib]]

... и это приводит к:

*** [Play Games Plugin DLL] 01/01/19 17:51:50 +01:00 ERROR: ShowLeaderboardUI can only be called after authentication.
  • Я пробовал разные типы сборки (внутренняя и gradle).
  • Я опубликовал приложение в Google Play для внутренних и альфа-тестеров с учетной записью Google устройства, установленной в качестве тестовой учетной записи.

Я пытался проверить сертификат SHA-1, но не знал, как проверить и сопоставить Keystore и SHA-1 из консоли Google Play на Mac.

Это код, который выполняется, когда сцена загружается в Unity:

void ActivateGooglePlayServices()
{
    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().RequestIdToken().Build();
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.Activate();
    LoginToGooglePlay();

}

public void LoginToGooglePlay()
{
    ((PlayGamesPlatform)Social.Active).localUser.Authenticate((bool success) =>
    {
        if (success)
        {
            Debug.Log("!!! Login Success !!!");
        }
        else
        {
            Debug.Log("!!! login failed !!! ");
        }
    });
}

Вызов Leaderboard выглядит следующим образом:

public void ShowLeaderBoard()
{
    // this didn't work at all: --> ((PlayGamesPlatform)Social.Active).ShowLeaderboardUI (leaderboard_ID);
    // The following line throws: *** [Play Games Plugin DLL] 01/01/19 17:51:50 +01:00 ERROR: ShowLeaderboardUI can only be called after authentication.
    Social.ShowLeaderboardUI();

}

Вся часть с ошибкой с NullReferenceException я не могу понять:

 2019-01-01 18:00:56.564 16197-16236/com.NGDD.XXXX W/Unity: *** [Play Games Plugin DLL] 01/01/19 18:00:56 +01:00 ERROR: UnityEngine.AndroidJavaException: java.lang.ClassNotFoundException: com.google.games.bridge.TokenFragment
java.lang.ClassNotFoundException: com.google.games.bridge.TokenFragment
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:400)
    at java.lang.Class.forName(Class.java:326)
    at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
    at com.unity3d.player.UnityPlayer.c(Unknown Source)
    at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source)
    at android.os.MessageQueue.next(MessageQueue.java:392)
    at android.os.Looper.loop(Looper.java:136)
    at com.unity3d.player.UnityPlayer$e.run(Unknown Source)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.games.bridge.TokenFragment" on path: DexPathList[[zip file "/data/app/com.NGDD.XXXX-2/base.apk"],nativeLibraryDirectories=[/data/app/com.NGDD.XXXX-2/lib/arm, /data/app/com.NGDD.XXXX
2019-01-01 18:00:56.613 16197-16805/com.NGDD.XXXX W/google-breakpad: ### ### ### ### ### ### ### ### ### ### ### ### ###
2019-01-01 18:00:56.613 16197-16805/com.NGDD.XXXX W/google-breakpad: Chrome build fingerprint:
2019-01-01 18:00:56.613 16197-16805/com.NGDD.XXXX W/google-breakpad:71.0.3578.99
2019-01-01 18:00:56.613 16197-16805/com.NGDD.XXXX W/google-breakpad:357809952
2019-01-01 18:00:56.613 16197-16805/com.NGDD.XXXX W/google-breakpad:### ### ### ### ### ### ### ### ### ### ### ### ###
2019-01-01 18:00:56.614 16197-16805/com.NGDD.XXXX E/mono: Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
  at UnityEngine.AndroidJavaObject.Dispose (Boolean disposing) [0x00007] in /Users/builduser/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:230 
  at UnityEngine.AndroidJavaObject.Finalize () [0x00003] in /Users/builduser/buildslave/unity/build/Runtime/Export/AndroidJavaImpl.cs:225 

Ожидаемым результатом будет появление пользовательского интерфейса таблицы лидеров Google при вызове ShowLeaderBoard().

1 ответ

Решение

У меня была та же самая проблема в течение многих дней, и я только что понял это.

Если в имени пути вашего проекта есть специальный символ, он не будет разрешен.

В моем проекте была папка с "!" в имени пути я просто переименовал папку и убедился, что не использовать пробелы или специальные символы, и теперь это работает!

Я надеюсь, что это исправит и вашу проблему!