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

Android应用开发:如何判断成就是否完成及增量成就目标达成?

如何确认成就解锁状态及查询进度(Google Play Games Services 新API)

嘿,刚好我之前处理过类似的需求,你现在用的Games.getAchievementsClient()是官方推荐的新API,旧的Games.Achievements确实已经被废弃了,咱们直接基于新API来解决问题:

一、确认unlockImmediate是否执行成功

unlockImmediate()方法本身会返回一个Task<Achievements.UpdateAchievementResult>对象,你完全可以通过给这个Task添加监听器,直接获取解锁操作的结果,不用再找旧的回调方案啦:

Games.getAchievementsClient(MyActivity.this, acct)
    .unlockImmediate(my_achievement_id)
    .addOnCompleteListener(task -> {
        if (task.isSuccessful()) {
            Achievements.UpdateAchievementResult result = task.getResult();
            if (result.getUpdated()) {
                // 这次操作确实把成就从锁定状态改成了解锁状态
                Toast.makeText(MyActivity.this, "成就解锁成功!", Toast.LENGTH_SHORT).show();
            } else {
                // 这个成就本来就是解锁状态,这次操作没产生变化
                Toast.makeText(MyActivity.this, "该成就已解锁", Toast.LENGTH_SHORT).show();
            }
        } else {
            // 解锁失败,可能是网络问题、用户未登录或者ID错误
            Exception exception = task.getException();
            Toast.makeText(MyActivity.this, "解锁失败:" + exception.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

二、查询成就的当前状态(判断是否解锁/增量成就进度)

如果需要主动查询某个成就的状态(比如启动App时同步成就,或者检查增量成就是否达成目标),可以用load()方法获取所有成就的信息,再筛选你需要的那个:

Games.getAchievementsClient(MyActivity.this, acct)
    .load(true) // true表示从服务器刷新最新数据,false则用本地缓存
    .addOnSuccessListener(result -> {
        for (Achievement achievement : result.getAchievements()) {
            if (achievement.getAchievementId().equals(my_achievement_id)) {
                // 找到目标成就,判断状态
                switch (achievement.getState()) {
                    case Achievement.STATE_UNLOCKED:
                        // 已解锁状态
                        break;
                    case Achievement.STATE_LOCKED:
                        // 未解锁,还没满足条件
                        break;
                    case Achievement.STATE_IN_PROGRESS:
                        // 增量成就,正在进行中
                        int currentSteps = achievement.getCurrentSteps();
                        int totalSteps = achievement.getTotalSteps();
                        // 检查是否达成目标步数
                        if (currentSteps >= totalSteps) {
                            // 可以手动调用unlockImmediate完成解锁,或者给用户提示
                        }
                        break;
                }
                break;
            }
        }
    })
    .addOnFailureListener(exception -> {
        // 查询失败,处理错误逻辑
    });

小提醒

  • 对于增量成就,你也可以用incrementImmediate()方法来增加进度,同样通过Task回调确认操作结果
  • 所有成就操作的前提是用户已经成功登录Google Play Games,否则都会失败哦

内容的提问来源于stack exchange,提问作者bra_racing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:57