Android 当玩家不在';我没有登录
我第一次使用谷歌的成就API,发现它的设置相当简单。我在大约一个小时内安装并运行了它,然而,有一件事我就是搞不清楚,那就是当用户未登录时如何解锁成就(或者更确切地说,存储成就x已在本地解锁的事实,以便用户下次登录时可以实际解锁) 如果用户已登录,我的成就解锁正常 最初,当我在没有登录的情况下进行测试时,我的LogCat中突然出现了一个“GoogleAppClient尚未连接”错误 所以我做了这样的事情: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
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);
}
祝你一切顺利:)希望对某人有所帮助。似乎没有足够的文档。在一些研发工作之后,我做了一些观察。也许它会对某人有用
嗯,谢谢@SimonMeier,文档似乎暗示这一切应该自动发生“一项成就可以离线解锁”。当游戏上线时,它会与Google Play games服务同步,以更新成就的解锁状态。“-然而,我不明白这是怎么回事,因为我们知道,如果在未登录的情况下尝试解锁,会引发异常。奇怪!这不是一个完整的答案,但我认为您需要小心区分“脱机”和“未登录”。如果只是离线(没有数据连接),一切都可以正常工作。但是如果他们没有登录并且正在玩你的游戏。。。你应该认为他们是不同的用户。您需要明确地将匿名、已注销的游戏“升级”到已登录的游戏(经用户同意)。这意味着成就、已保存的游戏、排行榜等等。我认为这样做的目的是,你保留一份所有成就州的本地副本,并酌情同步它们。如果成就在本地解锁,则在同步时,应在播放服务器上将其设置为解锁。