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
相关产品推荐
相关产品推荐

