Игровой сервис Google Play и API Google Диска устарели - PullRequest
0 голосов
/ 24 декабря 2018

Я работаю над модулем для Godot Engine, он называется godot-android.Вы можете найти этот модуль здесь .Этот модуль использует API Google Drive через SnapshotClient для сохранения игр на диске Google.

Поскольку я использую этот модуль для одной из своих игр для Android, выпущенных ранее в этом году, я получил электронное письмо от Google об устареванииGoogle Drive Android API говорит, что мое приложение использует устаревший API Google Drive.

Итак, я снова начал читать документацию Сервисов Google Play для Android , но они сделали этоне обновлять свою документацию.Затем, после нескольких часов, потраченных на переполнение стека / руководство по миграции github , чтобы выяснить, как перенести этот SnapshotClient, я просто ударил стену.

MyПервым шагом было обновить все зависимости моих модулей до их последних версий, скомпилировать и посмотреть, что не работает:

  com.google.firebase:firebase-core:16.0.6
  com.google.firebase:firebase-auth:16.1.0
  com.google.firebase:firebase-invites:16.0.6
  com.google.firebase:firebase-messaging:17.3.4
  com.google.firebase:firebase-appindexing:17.1.0
  com.google.android.gms:play-services-auth:16.0.1
  com.google.android.gms:play-services-games:16.0.0
  com.google.android.gms:play-services-drive:16.0.0
  com.google.apis:google-api-services-drive:v3-rev136-1.25.0

И я был рад видеть, что все работает нормально.Шаг 2, измените код, используемый для получения доступа к API Google Drive:

  public GoogleAuthentication(Activity p_activity) {
    activity = p_activity;

    String webclientId = activity.getString(R.string.default_web_client_id);
    GoogleSignInOptions options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
    .requestIdToken(webclientId)
    // Since we are using SavedGames, we need to add the SCOPE_APPFOLDER to access Google Drive.
    .requestScopes(new Scope(DriveScopes.DRIVE))
    .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
    .requestScopes(new Scope(DriveScopes.DRIVE_APPDATA))
    .build();

    mGoogleApiClient = new GoogleApiClient.Builder(activity)
    .addApi(Games.API)
    .addScope(Games.SCOPE_GAMES)
    .addApi(Auth.GOOGLE_SIGN_IN_API, options)
    .setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL)
    .setViewForPopups(activity.getWindow().getDecorView().findViewById(android.R.id.content))
    .build();

    mAuth = FirebaseAuth.getInstance();
  }

Итак, игра запускается, у меня всплывающее окно с запросом областей (правильные), я нажимаю на кнопку авторизации, итогда у меня нет доступа к моим играм.Adb logcat:

    E/Parcel  (  820): Class not found when unmarshalling: com.google.android.gms.common.api.Scope
    E/Parcel  (  820): java.lang.ClassNotFoundException: com.google.android.gms.common.api.Scope
    E/Parcel  (  820): Class not found when unmarshalling: com.google.android.gms.auth.firstparty.shared.ScopeData
    E/Parcel  (  820): java.lang.ClassNotFoundException: com.google.android.gms.auth.firstparty.shared.ScopeData
    E/Parcel  (  820): Class not found when unmarshalling: com.google.android.gms.auth.api.signin.internal.SignInConfiguration
    E/Parcel  (  820): java.lang.ClassNotFoundException: com.google.android.gms.auth.api.signin.internal.SignInConfiguration
    E/Parcel  (  820):  at java.lang.Class.classForName(Native Method)
    E/Parcel  (  820):  at java.lang.Class.forName(Class.java:251)
    E/Parcel  (  820):  at java.lang.Class.forName(Class.java:216)
    E/Parcel  (  820):  at android.os.Parcel.readParcelableCreator(Parcel.java:2140)
    E/Parcel  (  820):  at android.os.Parcel.readParcelable(Parcel.java:2104)
    E/Parcel  (  820):  at android.os.Parcel.readValue(Parcel.java:2020)
    E/Parcel  (  820):  at android.os.Parcel.readArrayMapInternal(Parcel.java:2321)
    E/Parcel  (  820):  at android.os.Bundle.unparcel(Bundle.java:249)
    E/Parcel  (  820):  at android.os.Bundle.getString(Bundle.java:1118)
    E/Parcel  (  820):  at android.content.Intent.getStringExtra(Intent.java:5261)
    E/Parcel  (  820):  at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1591)
    E/Parcel  (  820):  at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1169)
    E/Parcel  (  820):  at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4359)
    E/Parcel  (  820):  at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4241)
    E/Parcel  (  820):  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:164)
    E/Parcel  (  820):  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2878)
    E/Parcel  (  820):  at android.os.Binder.execTransact(Binder.java:404)
    E/Parcel  (  820):  at dalvik.system.NativeStart.run(Native Method)
    E/Parcel  (  820): Caused by: java.lang.NoClassDefFoundError: com/google/android/gms/auth/api/signin/internal/SignInConfiguration
    E/Parcel  (  820):  ... 18 more
    E/Parcel  (  820): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.auth.api.signin.internal.SignInConfiguration" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

1 Ответ

0 голосов
/ 24 декабря 2018

Обнаружена корневая проблема, области видимости были не правы:

public GoogleAuthentication(Activity p_activity) {
activity = p_activity;

String webclientId = activity.getString(R.string.default_web_client_id);
GoogleSignInOptions options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
.requestIdToken(webclientId)
// Since we are using SavedGames, we need to add the SCOPE_APPFOLDER to access Google Drive.
.requestScopes(new Scope(DriveScopes.DRIVE_FILE))
.requestScopes(new Scope(DriveScopes.DRIVE_APPDATA))
.build();

mGoogleApiClient = new GoogleApiClient.Builder(activity)
.addApi(Games.API)
.addScope(Games.SCOPE_GAMES)
.addApi(Auth.GOOGLE_SIGN_IN_API, options)
.setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL)
.setViewForPopups(activity.getWindow().getDecorView().findViewById(android.R.id.content))
.build();

mAuth = FirebaseAuth.getInstance();
}

Этот фрагмент кода работает хорошо, я обновил модуль github, вы можете посмотреть на коммит .

...