Android 当玩家不在';我没有登录

Android 当玩家不在';我没有登录,android,google-play-games,google-api-client,achievements,Android,Google Play Games,Google Api Client,Achievements,我第一次使用谷歌的成就API,发现它的设置相当简单。我在大约一个小时内安装并运行了它,然而,有一件事我就是搞不清楚,那就是当用户未登录时如何解锁成就(或者更确切地说,存储成就x已在本地解锁的事实,以便用户下次登录时可以实际解锁) 如果用户已登录,我的成就解锁正常 最初,当我在没有登录的情况下进行测试时,我的LogCat中突然出现了一个“GoogleAppClient尚未连接”错误 所以我做了这样的事情: public void unlockAchievements(){ if (isSi

我第一次使用谷歌的成就API,发现它的设置相当简单。我在大约一个小时内安装并运行了它,然而,有一件事我就是搞不清楚,那就是当用户未登录时如何解锁成就(或者更确切地说,存储成就x已在本地解锁的事实,以便用户下次登录时可以实际解锁)

如果用户已登录,我的成就解锁正常

最初,当我在没有登录的情况下进行测试时,我的LogCat中突然出现了一个“GoogleAppClient尚未连接”错误

所以我做了这样的事情:

public void unlockAchievements(){
    if (isSignedIn()){        
        Games.Achievements.unlock(getApiClient(), myAchievementID);
    }
}
这显然避免了崩溃,但(同样,显然)如果用户尚未登录,则不会解锁成就

是否有一种“官方”的处理方式(我似乎在文件中找不到任何提及,尽管我可能错过了)

如果没有,有什么好办法

我可以这样做:

if (score>1000){  
    score1000Achievement = true;  //Save this to SharedPreferences
}
然后,稍后,执行以下操作:

onSignInSucceeded(){
    if (score1000Achievement){
        Games.Achievements.unlock(getApiClient(), myAchievementID);  
    }
}
然而,这将在每次登录时运行并尝试解锁,这将在多个成就和多个用户的情况下肯定会增加我的API调用,从而不必要地消耗我的配额

谢谢你的建议

编辑

刚在安卓开发者网站上找到这个

解锁成就表示玩家已成功获得该成就。成就可以离线解锁。当游戏上线时,它会与Google Play games服务同步,以更新成就的解锁状态


然而,似乎没有进一步提到这一点,也没有关于如何实现这一点的例子。

我采用了与您相同的方法,但我保存了另一个布尔值,以了解这一成就是否在Google play上解锁。但是我记不起来解锁是否有成功的返回值。

我知道已经晚了,但仍然想分享我的方法 我的方法类似,即将所有成就的状态保存到共享参考。但我没有使用两个布尔值(根据Simon的回答),一个用来存储成绩,另一个用来检查成绩是否在Google Play上解锁。相反,我使用int来存储成就的状态

对于eg-1,表示该成果尚未解锁,0表示该成果已解锁,1表示该成果已发布到Google Play

下面是一小段代码供参考

public class AccomplishmentsOutbox {
    public static final int LOCKED = -1;
    public static final int UNLOCKED = 0;
    public static final int PUSHED = 1;

    private static final String PREFS_KEY_ACCOMPLISHMENTS = "player_accomplishments";
    // ACHIEVEMENTS
    private static String PREFS_KEY_ACH_1;

    // Singleton instance
    private static AccomplishmentsOutbox mOutbox;
    private SharedPreferences settings;

    private AccomplishmentsOutbox(Context mContext) {
        settings = mContext.getSharedPreferences(PREFS_KEY_ACCOMPLISHMENTS, Context.MODE_PRIVATE);

        // ACHIEVEMENTS
        PREFS_KEY_ACH_1 = mContext.getString(R.string.achievement_one);
    }
    public static AccomplishmentsOutbox getAccomplishmentsOutbox(Context context) {
        if (mOutbox == null) {
            mOutbox = new AccomplishmentsOutbox(context);
        }
        return mOutbox;
    }

    public int isOne() {
        return settings.getInt(PREFS_KEY_ACH_1, LOCKED);
    }

    public void putOne(int value) {
        settings.edit().putInt(PREFS_KEY_ACH_1, value).apply();
    }
}
现在,当我想检查在我使用的活动中是否解锁了一项成就时:这将在共享首选项中保存状态

AccomplishmentsOutbox mOutbox = AccomplishmentsOutbox.getAccomplishmentsOutbox(this);

if (corrected == 0) {
            mOutbox.putOne(AccomplishmentsOutbox.UNLOCKED);
}
现在,当我连接到玩游戏时,我只需检查成就是否在本地解锁,然后在玩游戏时解锁

if (isSignedIn()) {
            if (mOutbox.isOne() == AccomplishmentsOutbox.UNLOCKED) {
                Games.Achievements.unlock(mGoogleApiClient, getString(R.string.achievement_one));
                mOutbox.putOne(AccomplishmentsOutbox.PUSHED);
            }

祝你一切顺利:)希望对某人有所帮助。

似乎没有足够的文档。在一些研发工作之后,我做了一些观察。也许它会对某人有用

  • 初始登录需要网络连接

  • 初始“登录”将在本地创建一份成就副本

  • 每当应用程序脱机时(即没有网络连接,但已登录),应用程序将在本地存储的副本上运行

  • 每当mGoogleApiClient再次通过网络连接到谷歌服务器时,它会自动更新服务器,并在本地解锁


  • 嗯,谢谢@SimonMeier,文档似乎暗示这一切应该自动发生“一项成就可以离线解锁”。当游戏上线时,它会与Google Play games服务同步,以更新成就的解锁状态。“-然而,我不明白这是怎么回事,因为我们知道,如果在未登录的情况下尝试解锁,会引发异常。奇怪!这不是一个完整的答案,但我认为您需要小心区分“脱机”和“未登录”。如果只是离线(没有数据连接),一切都可以正常工作。但是如果他们没有登录并且正在玩你的游戏。。。你应该认为他们是不同的用户。您需要明确地将匿名、已注销的游戏“升级”到已登录的游戏(经用户同意)。这意味着成就、已保存的游戏、排行榜等等。我认为这样做的目的是,你保留一份所有成就州的本地副本,并酌情同步它们。如果成就在本地解锁,则在同步时,应在播放服务器上将其设置为解锁。