android - Google Play 游戏服务和 Google Drive API 已弃用

标签 android google-drive-api google-play-games

我正在为 Godot Engine 开发一个模块,它叫做 godot-android。你可以找到this module here .该模块通过 SnapshotClient 使用 Google Drive API 将游戏保存在 google drive 上。

由于我在今年早些时候发布的一款安卓游戏中使用了这个模块,我收到了一封来自谷歌的关于 Google Drive Android API 被弃用的电子邮件,称我的应用程序使用的是 google drive deprecated API。

所以,我又开始阅读 Google Play Games Services documentation for android , 但他们没有更新他们的文档。然后,在 Stack-overflow 上花了几个小时之后/github migration guide要了解如何迁移该 SnapshotClient,我碰壁了。

我的第一步是将我的模块的所有依赖项升级到最新版本,编译并查看有什么问题:

  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 步,更改用于访问 google drive API 的代码:

  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();
  }

所以,游戏开始了,我有一个登录弹出窗口要求范围(正确的范围),我点击授权,然后我无法访问我的游戏存档。亚行日志:

    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]]

最佳答案

找出根本问题,作用域不对:

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模块,你可以看看at the commit .

关于android - Google Play 游戏服务和 Google Drive API 已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907164/

相关文章:

android - 找不到com.google.android.youtube意向

ios - Objective-C 在使用 Google Drive API 获取列表文件时使用 block

google-apps-script - 如何解析存储在我的谷歌驱动器中但作为 html 类型突出的 XML 文件?

android实时多人游戏-在游戏开始前在玩家之间共享数据

android - 以编程方式打开我的应用程序的谷歌播放服务页面

android - UnsatisfiedLinkError : No implementation found for void mono. android.text.TextWatcherImplementor

java - 我可以为每个 servlet 使用不同的 SSL 证书吗?

android - 在 Android 9 或更高版本中无法从 BroadcastReceiver 启动 Activity

google-drive-api - Android应用:获取Google Drive API的访问 token

android - Google Play 游戏服务 : Debug AND Release certificate