我第一次使用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游戏服务同步,以更新成就的解锁状态。
然而,似乎没有进一步提及它,也没有示例如何实现。
答案 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工作之后,我已经做了一些观察。可能对某人有用。
初次登录时需要网络连接。
初始“登录”会在本地创建成就副本。
每当应用程序变为OFFLINE(即没有网络连接,但已登录)时,应用程序将在本地存储的副本上运行。
每当mGoogleApiClient再次通过网络与谷歌服务器连接时,它会自动使用本地未锁定的成就更新服务器。