Flutter华为游戏服务集成插件huawei_gameservice的使用

Flutter华为游戏服务集成插件huawei_gameservice的使用

简介

随着华为游戏服务的集成,您将能够访问一系列开发功能。通过让用户使用他们的华为ID登录,您可以迅速高效地推广您的游戏到华为庞大的用户群。此外,您还可以快速实现成就、游戏事件和游戏防沉迷功能,以低成本构建基础游戏能力,并基于用户和内容进行本地化深入游戏运营。

华为游戏服务为您的游戏应用提供了以下基本功能:

  • 游戏防沉迷
  • 悬浮窗
  • 成就
  • 事件
  • 排行榜
  • 保存的游戏
  • 玩家统计信息
  • 访问基本游戏信息

华为游戏服务Flutter插件使华为游戏服务SDK与Flutter平台之间通信成为可能,并暴露了华为游戏服务的所有功能。

安装

请参阅pub.devAppGallery Connect配置

文档

游戏登录需求

要实现游戏登录功能,玩家可以使用华为ID登录您的游戏,请使用华为账户Flutter插件。用户成功登录后,华为账号工具包会将验证结果发送给您的游戏,并且您可以调用Players客户端的相关API来获取玩家信息。

测试游戏功能

您需要一个测试账户来进行一些游戏功能的测试。有关如何创建测试账户的详细信息,请参阅管理测试账户

在游戏发布之前,您可以使用测试账户登录游戏并测试成就、排行榜和保存的游戏。避免在相应的游戏仍在测试时发布成就或排行榜,因为成就或排行榜数据会随着测试账户的游戏操作而变化,并且一旦发布无法重置。

请注意,只有当您的游戏发布并且设备运行EMUI 10.0或更高版本且安装了华为AppAssistant 10.3或更高版本时,华为AppAssistant才能显示成就、排行榜和保存的游戏(华为AppAssistant 10.1或更高版本用于成就)。

示例项目

该插件包含一个位于example文件夹内的演示项目,您可以在此找到使用示例。请遵循安装部分中的说明以成功运行演示应用程序。

示例应用截图

问题或建议

如果您对如何使用HMS样本有任何疑问,请尝试以下选项:

  • Stack Overflow 是任何编程问题的最佳场所。请确保您的问题带有标签 huawei-mobile-services
  • GitHub 是这些插件的官方存储库,您可以在其中打开问题或提交您的想法。
  • 华为开发者论坛 HMS核心模块非常适合一般问题、建议和意见。
  • 华为开发者文档 是所有HMS核心工具包的官方文档,您可以在那里找到详细的文档。

如果您在样本中遇到错误,请提交到Github仓库

许可证

华为游戏服务Flutter插件是在Apache 2.0许可证下授权的。


示例代码

/*
    版权所有 2021-2022. 华为技术有限公司。保留所有权利。

    根据Apache许可证,版本2.0(“许可证”),您不能使用此文件除非符合许可证。
    您可以从中获得许可证的副本
    在 https://www.apache.org/licenses/LICENSE-2.0

    除非适用法律要求或书面同意,否则根据许可证分发的软件按“原样”分发,
    不附带任何明示或暗示的担保或条件。有关许可证具体语言的权限和限制,
    请参阅许可证。
*/

import 'dart:developer';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:huawei_account/huawei_account.dart';
import 'package:huawei_gameservice/huawei_gameservice.dart';

void main() {
  runApp(const _MyApp());
}

class _MyApp extends StatelessWidget {
  const _MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: _Home(),
    );
  }
}

class _Home extends StatefulWidget {
  const _Home({Key? key}) : super(key: key);

  [@override](/user/override)
  State<_Home> createState() => _HomeState();
}

class _HomeState extends State<_Home> {
  AuthAccount? authAccount;

  [@override](/user/override)
  void initState() {
    super.initState();
    init();
  }

  /// 初始化游戏服务。
  ///
  /// 此方法应在调用其他API之前调用。
  void init() async {
    await JosAppsClient.init();

    await showDialog(
      context: context,
      builder: (BuildContext context) {
        return const AlertDialog(
          title: Text('警告'),
          content: Text(
            '为了尝试游戏服务方法,请将您的华为ID添加到AppGallery Connect上的测试账户中。',
          ),
        );
      },
    );
  }

  Future<dynamic> signIn() async {
    final AccountAuthParamsHelper authParamsHelper = AccountAuthParamsHelper()
      ..setIdToken()
      ..setAccessToken()
      ..setAuthorizationCode()
      ..setEmail()
      ..setScopeList(<Scope>[Scope.game])
      ..setProfile();
    final AccountAuthParams authParams = authParamsHelper.createParams();
    final AccountAuthService authService = AccountAuthManager.getService(
      authParams,
    );
    final AuthAccount authAccount = await authService.signIn();
    setState(() => this.authAccount = authAccount);
    return authAccount.toMap();
  }

  Future<dynamic> getAppId() async {
    final String appId = await GamesClient.getAppId();
    return appId;
  }

  Future<dynamic> earnAchievement() async {
    // 显示隐藏的成就。
    await AchievementClient.visualizeWithResult('<achievement_id>');
    // 获得成就。
    final bool result =
        await AchievementClient.reachWithResult('<achievement_id>');
    return result;
  }

  Future<dynamic> getGamePlayer() async {
    final Player gamePlayer = await PlayersClient.getGamePlayer(
      isRequirePlayerId: true,
    );
    return gamePlayer;
  }

  Future<dynamic> getGamePlayerStatistics() async {
    final GamePlayerStatistics gamePlayerStatistics =
        await GamePlayerStatisticsClient.getGamePlayerStatistics(true);
    return gamePlayerStatistics;
  }

  Future<dynamic> getGameSummary() async {
    final GameSummary gameSummary = await GameSummaryClient.getGameSummary();
    return gameSummary;
  }

  /// 在AppGallery Connect上创建成就并输入其id到reachWithResult方法中。
  Future<dynamic> earnFirstTimeAchievement() async {
    final bool result =
        await AchievementClient.reachWithResult('<achievement_id>');
    return result;
  }

  /// 在AppGallery Connect上创建增量成就并输入其id到growWithResult方法中。
  Future<dynamic> earnIncrementalAchievement() async {
    final bool result = await AchievementClient.growWithResult(
      '<achievement_id>',
      1,
    );
    return result;
  }

  /// 在AppGallery Connect上创建事件并将事件id作为参数传递给grow方法以发送游戏开始事件。
  Future<dynamic> sendGameStartEvent() async {
    await EventsClient.grow('<event_id>', 1);
  }

  /// 若要提交排名分数,您应该在AppGallery Connect上创建一个排行榜并将Leaderboard ID作为参数传递给以下方法。
  Future<dynamic> submitRankingScore() async {
    final ScoreSubmissionInfo info = await RankingClient.submitScoreWithResult(
      '<leaderboard_id>',
      30,
    );
    return info;
  }

  Future<dynamic> addArchive() async {
    const int score = 30;
    final Uint8List bytes = Uint8List.fromList(score.toString().codeUnits);
    final ArchiveDetails archiveDetails = ArchiveDetails(bytes);
    final ArchiveSummaryUpdate archiveSummaryUpdate = ArchiveSummaryUpdate(
      descInfo: '我的得分于${DateTime.now()}保存。',
    );
    final ArchiveSummary archiveSummary = await ArchivesClient.addArchive(
      archiveDetails,
      archiveSummaryUpdate,
      false,
    );
    return archiveSummary;
  }

  /// 排行榜方法展示。
  Future<dynamic> showRankings() async {
    await RankingClient.showTotalRankingsIntent();
    // 获取所有排行榜及其排名。
    final List<Ranking> rankings =
        await RankingClient.getAllRankingSummaries(true);
    return rankings;
  }

  /// 成就方法展示。
  Future<dynamic> showAchievements() async {
    // 显示所有成就。
    await AchievementClient.showAchievementListIntent();
    // 获取所有成就。
    final List<Achievement> achievements =
        await AchievementClient.getAchievementList(true);
    return achievements;
  }

  /// 保存的方法展示。
  Future<dynamic> showSaves() async {
    // 显示所有存档。
    await ArchivesClient.showArchiveListIntent(
      'Flutter插件演示',
      true,
      true,
      10,
    );
    // 获取所有存档摘要。
    final List<ArchiveSummary> archiveSummaries =
        await ArchivesClient.getArchiveSummaryList(true);
    return archiveSummaries;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('华为游戏服务演示'),
        centerTitle: true,
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Container(
            alignment: Alignment.center,
            padding: const EdgeInsets.all(16.0),
            child: Text(
              authAccount != null
                  ? '欢迎,${authAccount?.displayName}'
                  : '欢迎',
              style: const TextStyle(fontWeight: FontWeight.bold),
              textAlign: TextAlign.center,
            ),
          ),
          Expanded(
            child: SingleChildScrollView(
              padding: const EdgeInsets.all(16),
              physics: const BouncingScrollPhysics(
                parent: AlwaysScrollableScrollPhysics(),
              ),
              child: Wrap(
                spacing: 8,
                runSpacing: 8,
                alignment: WrapAlignment.center,
                children: <Widget>[
                  buildButton(
                    text: '使用华为ID登录',
                    onPressed: signIn,
                  ),
                  buildButton(
                    text: '获取应用ID',
                    onPressed: getAppId,
                  ),
                  const Divider(),
                  buildButton(
                    text: '获取游戏玩家',
                    onPressed: getGamePlayer,
                  ),
                  buildButton(
                    text: '获取游戏玩家统计数据',
                    onPressed: getGamePlayerStatistics,
                  ),
                  buildButton(
                    text: '获取游戏摘要',
                    onPressed: getGameSummary,
                  ),
                  const Divider(),
                  buildButton(
                    text: '发送游戏开始事件',
                    onPressed: sendGameStartEvent,
                  ),
                  buildButton(
                    text: '添加存档',
                    onPressed: addArchive,
                  ),
                  const Divider(),
                  buildButton(
                    text: '获得成就',
                    onPressed: earnAchievement,
                  ),
                  buildButton(
                    text: '首次获得成就',
                    onPressed: earnFirstTimeAchievement,
                  ),
                  buildButton(
                    text: '获得增量成就',
                    onPressed: earnIncrementalAchievement,
                  ),
                  const Divider(),
                  buildButton(
                    text: '显示排行榜',
                    onPressed: showRankings,
                  ),
                  buildButton(
                    text: '显示成就',
                    onPressed: showAchievements,
                  ),
                  const Divider(),
                  buildButton(
                    text: '显示存档',
                    onPressed: showSaves,
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }

  Widget buildButton({
    required String text,
    required Future<dynamic> Function() onPressed,
  }) {
    return ElevatedButton(
      onPressed: () async {
        String dialogTitle;
        String dialogMessage;
        String logMessage;
        try {
          final dynamic result = await onPressed.call() ?? '';
          dialogTitle = '成功';
          dialogMessage = '$result';
          logMessage = '成功 $result';
        } on PlatformException catch (e) {
          dialogTitle = '失败';
          dialogMessage = '异常: $e\n\n'
              '代码: ${e.code}\n'
              '消息: ${GameServiceResultCodes.getStatusCodeMessage(e.code)}';
          logMessage = '失败 $e';
        }

        log(logMessage, name: text);
        await showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: Text(dialogTitle),
              content: dialogMessage.isNotEmpty
                  ? SingleChildScrollView(
                      child: Text(dialogMessage),
                    )
                  : null,
            );
          },
        );
      },
      child: Text(text),
    );
  }
}

更多关于Flutter华为游戏服务集成插件huawei_gameservice的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter华为游戏服务集成插件huawei_gameservice的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


要在Flutter应用中集成华为游戏服务(Huawei Game Service),你可以使用huawei_gameservice插件。以下是如何使用该插件的详细步骤:

1. 添加依赖

首先,在pubspec.yaml文件中添加huawei_gameservice插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  huawei_gameservice: ^x.x.x # 请使用最新版本

然后,运行flutter pub get来获取依赖。

2. 配置华为开发者账号

在华为开发者联盟网站上注册并创建一个应用,获取App IDClient ID。确保你已经启用了游戏服务。

3. 配置Android项目

android/app/build.gradle文件中,添加华为游戏服务的依赖:

dependencies {
    implementation 'com.huawei.hms:game:6.x.x' // 使用最新版本
}

android/app/src/main/AndroidManifest.xml文件中,添加必要的权限和元数据:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:name=".MyApplication"
        android:label="Your App Name"
        android:icon="@mipmap/ic_launcher">

        <meta-data
            android:name="com.huawei.hms.client.appid"
            android:value="your_app_id" /> <!-- 替换为你的App ID -->

    </application>
</manifest>

4. 初始化游戏服务

在Flutter应用的入口处初始化华为游戏服务:

import 'package:huawei_gameservice/huawei_gameservice.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await HuaweiGamesService.init();
  runApp(MyApp());
}

5. 登录和获取玩家信息

使用HuaweiGamesService类提供的API进行登录和获取玩家信息:

import 'package:huawei_gameservice/huawei_gameservice.dart';

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Huawei Game Service Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  try {
                    await HuaweiGamesService.signIn();
                    print('Sign in successful');
                  } catch (e) {
                    print('Sign in failed: $e');
                  }
                },
                child: Text('Sign In'),
              ),
              ElevatedButton(
                onPressed: () async {
                  try {
                    PlayerInfo playerInfo = await HuaweiGamesService.getPlayerInfo();
                    print('Player Info: ${playerInfo.displayName}');
                  } catch (e) {
                    print('Failed to get player info: $e');
                  }
                },
                child: Text('Get Player Info'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部