Xamarin Android中如何实现Google Play Games Services v2登录?
解决Xamarin Android集成Google Play Games Services v2的登录问题
你遇到的SetJniIdentityHashCode未实现异常,是因为手动实现IOnCompleteListener时不需要重写那些JNI相关方法——Xamarin会自动处理这些逻辑,只需要实现接口要求的核心方法即可。下面是完整正确的C#登录逻辑实现:
正确的C#实现代码
using Android.Gms.Games; using Android.Gms.Tasks; using Android.App; using Android.Content; // 在Activity的OnCreate方法中完成初始化和登录状态检查 protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 初始化Play Games SDK PlayGamesSdk.Initialize(this); // 获取GamesSignInClient实例 IGamesSignInClient gamesSignInClient = PlayGames.GetGamesSignInClient(this); // 添加完成监听器 gamesSignInClient.IsAuthenticated().AddOnCompleteListener(new SignInStatusListener(this)); } // 仅实现必要的接口方法,无需处理JNI相关方法 public class SignInStatusListener : Java.Lang.Object, IOnCompleteListener { private readonly Activity _hostActivity; public SignInStatusListener(Activity activity) { _hostActivity = activity; } public void OnComplete(Task task) { if (task.IsSuccessful) { // 将Task.Result转换为SignInResult类型,获取登录状态 var signInResult = task.JavaCast<SignInResult>(); bool isAuthenticated = signInResult.IsAuthenticated; if (isAuthenticated) { // 已登录,继续执行Play Games相关逻辑 // 例如获取玩家信息、调用成就/排行榜接口等 } else { // 未登录,显示登录提示或禁用相关功能 ShowLoginPrompt(); } } else { // 状态检查失败,可添加错误日志或提示 var error = task.Exception?.Message; // 这里可以加入错误处理逻辑 } } private void ShowLoginPrompt() { // 示例:弹出登录确认对话框 new AlertDialog.Builder(_hostActivity) .SetTitle("登录Play Games") .SetMessage("需要登录以使用游戏服务功能") .SetPositiveButton("登录", (sender, args) => { // 触发登录流程 PlayGames.GetGamesSignInClient(_hostActivity).SignIn().AddOnCompleteListener(signInTask => { if (signInTask.IsSuccessful) { // 登录成功后的后续处理 } }); }) .SetNegativeButton("取消", (sender, args) => { }) .Show(); } }
关键注意点
- 无需手动实现JNI方法:Xamarin的
Java.Lang.Object已经封装了JNI相关的管理逻辑,只需要实现IOnCompleteListener要求的OnComplete方法即可,其余JNI相关方法不需要重写。 - 类型转换:
task.Result必须通过JavaCast<SignInResult>()转换为对应类型,才能调用IsAuthenticated属性判断登录状态。 - 简化写法:也可以直接用匿名委托省略单独的监听器类,示例如下:
gamesSignInClient.IsAuthenticated().AddOnCompleteListener(new Java.Lang.Object(), new Action<Task>(task => { if (task.IsSuccessful) { var signInResult = task.JavaCast<SignInResult>(); if (signInResult.IsAuthenticated) { // 已登录逻辑 } else { // 未登录逻辑 } } }));
内容的提问来源于stack exchange,提问作者EstevaoLuis
相关产品推荐
相关产品推荐

