Flutter华为游戏服务集成插件huawei_gameservice的使用
Flutter华为游戏服务集成插件huawei_gameservice的使用
简介
随着华为游戏服务的集成,您将能够访问一系列开发功能。通过让用户使用他们的华为ID登录,您可以迅速高效地推广您的游戏到华为庞大的用户群。此外,您还可以快速实现成就、游戏事件和游戏防沉迷功能,以低成本构建基础游戏能力,并基于用户和内容进行本地化深入游戏运营。
华为游戏服务为您的游戏应用提供了以下基本功能:
- 游戏防沉迷
- 悬浮窗
- 成就
- 事件
- 排行榜
- 保存的游戏
- 玩家统计信息
- 访问基本游戏信息
华为游戏服务Flutter插件使华为游戏服务SDK与Flutter平台之间通信成为可能,并暴露了华为游戏服务的所有功能。
安装
请参阅pub.dev和AppGallery 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
更多关于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 ID
和Client 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'),
),
],
),
),
),
);
}
}