You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:15:36