在玩家未登录时处理Google Play游戏成就

时间:2015-08-03 12:53:56

标签: android google-play-games google-api-client achievements

我第一次使用Google的Achievements API,并且发现设置相当简单。我在大约一个小时内完成并运行了然而,有一件我无法弄清楚的,就是当用户没有登录时如何解锁成就(或者更确切地说是存储事实上,成就 x 已在本地解锁,因此当用户下次登录时,它实际上可以解锁。

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

最初,当我在未登录的情况下对其进行测试时,我的LogCat中出现了“ googleAPIClient尚未连接 ”错误。

所以我做了这样的事情:

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调用,因此会不必要地进入我的配额?

感谢任何建议

修改

刚刚在Android开发者网站上找到了这个

  

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

然而,似乎没有进一步提及它,也没有示例如何实现。

3 个答案:

答案 0 :(得分:1)

我做了与你相同的方法,但我保存了另一个布尔值,以了解Google Play上的成就是否已解锁。但是,如果解锁具有成功返回值,则无法记住。

答案 1 :(得分:0)

我知道现在已经晚了但仍想分享我的方法 我的方法类似,即将所有成就的状态保存到SharedPreferences。但我没有使用两个布尔(根据西蒙的回答)一个存储和成就,以及检查成就是否在Google Play上解锁。相反,我使用int来存储成就的状态。

例如-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();
    }
}

现在,当我想检查我使用的Activity中是否已解锁成就时:现在将状态保存在共享首选项中。

AccomplishmentsOutbox mOutbox = AccomplishmentsOutbox.getAccomplishmentsOutbox(this);

if (corrected == 0) {
            mOutbox.putOne(AccomplishmentsOutbox.UNLOCKED);
}

现在,当我连接到Play游戏时,我会简单地检查成就是否在本地解锁,然后在Play游戏中解锁。

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

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

答案 2 :(得分:0)

看来,没有足够的文件。在一些R& D工作之后,我已经做了一些观察。可能对某人有用。

  1. 初次登录时需要网络连接。

  2. 初始“登录”会在本地创建成就副本。

  3. 每当应用程序变为OFFLINE(即没有网络连接,但已登录)时,应用程序将在本地存储的副本上运行。

  4. 每当mGoogleApiClient再次通过网络与谷歌服务器连接时,它会自动使用本地未锁定的成就更新服务器。

相关问题