Android 游戏的平台身份验证

如需使用 Google Play 游戏服务功能,您的游戏需要提供经过身份验证的玩家的账号。本文档介绍了如何在游戏中实现无缝身份验证体验。

Play 游戏服务 v2 SDK 引入了多项改进,包括增加了登录游戏的用户数量以及简化了开发工作:

  • 针对用户的改进:
    • 选择默认账号后,用户便可登录账号,而无需与提示互动。
    • 用户不必再下载 Play 游戏应用即可通过 Play 游戏服务登录或创建新账号。
    • 用户现在可以通过单个页面管理多个游戏的 Play 游戏服务账号。
  • 针对开发者的改进:
  • 游戏启动时会自动触发登录,账号管理处理也将包含在操作系统设置中,因此客户端代码不再需要处理登录或退出流程。

新客户端集成

本部分介绍了如何与 Play 游戏服务登录 v2 进行新的客户端集成。

添加依赖项

将 Play 游戏服务 SDK 依赖项添加到应用的根级 build.gradle 文件中。如果您使用的是 Gradle,则可以按如下方式添加或更新依赖项:

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

定义项目 ID

如需将 Play 游戏服务 SDK 项目 ID 添加到应用,请按以下步骤操作:

  1. 在应用的 AndroidManifest.xml 文件中,将以下 <meta-data> 元素和属性添加到 <application> 元素:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    

    使用游戏的游戏服务项目 ID 作为值来定义字符串资源引用 @string/game_services_project_id。您可以在 Google Play 管理中心的“配置”页面中的游戏名称下找到游戏服务项目 ID。

  2. res/values/strings.xml 文件中,添加字符串资源引用,并将项目 ID 设置为值。在 Google Play 管理中心内,您可以在配置页面中的游戏名称下找到项目 ID。例如:

    <!-- res/values/strings.xml -->
    <resources>
      <!-- Replace 0000000000 with your game's project id. Example value shown above.  -->
      <string translatable="false"  name="game_services_project_id"> 0000000000 </string>
    </resources>
    

初始化 SDK

Application 类的 onCreate(..) 回调中初始化 Play 游戏 SDK。

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

获取身份验证结果

游戏启动时,系统会始终尝试对用户进行身份验证。如需对用户进行身份验证,您必须先验证用户是否已成功通过身份验证,然后获取其玩家 ID。

如需验证身份验证尝试,请调用 GamesSignInClient.isAuthenticated() 并使用 addOnCompleteListener 检索结果。例如:

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());

gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
  boolean isAuthenticated =
    (isAuthenticatedTask.isSuccessful() &&
     isAuthenticatedTask.getResult().isAuthenticated());

  if (isAuthenticated) {
    // Continue with Play Games Services
  } else {
    // Show a sign-in button to ask players to authenticate. Clicking it should
    // call GamesSignInClient.signIn().
  }
});

防止自动触发个人资料创建

您可以通过清单文件停用自动触发的个人资料创建提示。这样,没有 Play 游戏服务个人资料的用户便可以继续加载游戏,而不会收到创建 Play 游戏服务个人资料的提示。 如需了解详情,请参阅个人资料创建选项

如需使用此功能,请确保满足以下条件:

  • 在设备上登录的任何 Google 账号中都没有 Play 游戏服务个人资料。
  • 您的游戏已与 Play 游戏服务 SDK com.google.android.gms:play-services-games-v2:21.0.0 或更高版本集成。

如需防止自动触发的个人资料创建提示,请按以下步骤操作:

  1. AndroidManifest.xml 文件中,将 com.google.android.gms.games.SUPPRESS_GAME_PROFILE_CREATION 标记添加到 <meta-data> 元素和属性到 <application> 元素:

    <application>
        ...
        <meta-data
            android:name="com.google.android.gms.games.SUPPRESS_GAME_PROFILE_CREATION"
            android:value="true" />
        ...
    </application>
    

    将此标志设置为 true 会通知 Play 游戏服务,您的游戏将处理个人资料创建过程。因此,Play 游戏服务不会自动为设备上没有现有 Play 游戏服务个人资料的用户显示个人资料创建界面。

  2. 当您调用任何 Play 游戏服务 API 时, GamesClientStatusCodes.SIGN_IN_REQUIRED 状态代码表示调用失败,因为用户无法 自动通过身份验证,原因是缺少 Play 游戏服务 个人资料。

    这样,没有 Play 游戏服务个人资料的用户便可以继续使用您实现的身份验证方法,而不会立即收到创建 Play 游戏服务个人资料的提示。 可以通过调用 GamesSignInService.signin()来启动个人资料创建。

    import com.google.android.gms.games.PlayGames;
    ...
    
    // Get the achievements client using Play Games services.
    AchievementsClient achievementsClient = PlayGames.getAchievementsClient(getActivity());
    achievementsClient.getAchievementsIntent()
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception exception) {
                int statusCode = ((ApiException) exception).getStatusCode();
                if (statusCode == GamesClientStatusCodes.SIGN_IN_REQUIRED) {
                  // SIGN_IN_REQUIRED: The user needs to sign in with Play Games Services.
                  // Call GamesSignInService.signin() to prompt for
                  // authentication at a suitable time which will trigger the
                  // profile creation UI.
                  // (e.g., after a tutorial). Use GamesSignInService.isAuthenticated() to check auth status.
                }
              }
            });
  3. 添加抑制标记后,使用 logcat 窗口验证添加操作。logcat 输出包含类似于以下内容的消息:“Game opted out of automatic profile creation prompt (using manifest)”。