一、使用前提小米成就SDK目前处于内测阶段,接入成就功能必须先按照小米游戏SDK,接入登录功能,支持的小米游戏SDK版本必须为3.3.0.6及以上,获取成就功能必须同时接入小米游戏SDK和成就系统SDK。

二、SDK接入1、引入资源完成小米游戏SDK登录功能接入后,请参考集成小米游戏SDK中的操作,并按照以下示例添加小米成就SDK依赖。

dependencies { ... //小米网游SDK,成就SDK必须使用3.3.0.6及以上版本 def lastVersion = "3.3.0.6" implementation "com.google.code.gson:gson:2.8.6" implementation "com.google.zxing:core:3.2.0" implementation "com.alipay.sdk:alipaysdk-android:15.8.09@aar" implementation "com.xiaomi.gamecenter.sdk:mioauth:$lastVersion" implementation "com.xiaomi.gamecenter.sdk:onetrack-sdk:1.2.7" //小米成就SDK start implementation "com.xiaomi.gamecenter.sdk:miAchievement:1.0.1" implementation "com.google.protobuf:protobuf-java:3.12.0" implementation "org.greenrobot:eventbus:3.0.0" //小米成就SDK end }a、混淆

-keep class com.xiaomi.gamecenter.sdk.achievement.** {*;} -keep class com.google.protobuf.** {*;} -keep class org.greenrobot.eventbus.** {*;} -keep class com.mi.milink.** {*;}2、注册监听回调成就SDK中包含多个监听回调,分别会在初始化数据成功、初始化数据失败以及成就进度更新时被调用,请特别注意初始化数据成功的回调,这是成就SDK调用其他接口的前提,初始化数据失败时请提示用户或者在合适的时候重新初始化数据 。(错误码见附录3.2)。

MiAchievement.registerCallback(new MiAchievementCallback() { @Override public void onAchievementSDKInitSuccess() { //初始化成功 } @Override public void onAchievementSDKInitFail(int code, String msg) { // 初始化失败 } @Override public void onAchievementStatusUpdate(MIAchievementBean miAchievementBean, int code, String msg) { if (code == MiAchievementErrorCode.ACHIEVEMENT_SUCCESS) { //成就更新成功 }else { // 成就更新失败 } } });3、初始化数据由于SDK会在本地记录用户的成就数据,所以请在务必在登录成功后初始化数据。此操作为异步操作,需要确认收到初始化成功回调时才能进行成就上报等其他操作。

MiAchievement.initData(); //初始化4、获取全部成就数据全部成就数据分为本地数据和服务端数据两种。本地数据是记录在内存与磁盘缓存中,本地数据会在调用初始化数据接口成功后更新。主动调用服务端数据接口时也会更新本地数据。如果对成就数据的实时性要求比较高,可以调用获取服务端数据接口,正常情况下使用本地数据即可。(错误码见附录3.2)。

// 获取本地数据 List allAchievementList= MiAchievement.getLocalAllAchievementList(); // 获取服务器数据 MiAchievement.fetchAllAchievementList((list, code, msg) -> { if (code == MiAchievementErrorCode.ACHIEVEMENT_SUCCESS) { //获取成就数据成功 } else { //获取成就数据失败 } });5、获取当前用户成就数据用户数据也分为本地数据与服务端数据两种。如果对成就数据的实时性要求比较高,可以调用获取服务端数据接口,正常情况下使用本地数据即可。(错误码见附录3.2)。

// 获取本地数据 List userAchievementList=MiAchievement.getLocalUserAchievementList(); // 获取服务器数据 MiAchievement.fetchUserAchievementList((list, code, msg) -> { if (code == MiAchievementErrorCode.ACHIEVEMENT_SUCCESS) { //获取成就数据成功 } else { //获取成就数据失败 } });6、达成某个成就用于上报用户成就达成的数据和触发冒泡弹窗。 分步式与非分步式成就均可用reach来达成成就。

// achievementId 成就Id 在开发者平台自行配置的 MiAchievement.reach("achievementId");7、分步成就增长步数分步式成就可以用增量与整体步数两种方式来上传。growSteps为增量方式,比如玩家新增了10步;makeSteps为整体步数方式,比如玩家目前累计完成了20步。

// achievementId 成就Id 在开发者平台自行配置的 MiAchievement.growSteps("achievementId", 10); MiAchievement.makeSteps("achievementId", 20);8、设置冒泡开关SDK会在成就达成时默认展示冒泡弹窗。若有关闭需要可以调用该接口。

MiAchievement.setShowToast(boolean isShow);三、附录1、成就信息 MIAchievementBean参数 类型 说明 achievementId String 成就id achievementName String 成就名称 achievementDesc String 成就描述 achievementIcon String 成就icon地址 achievementType Integer 成就类型 0:非分步骤 1:分步骤 achievementTotalStep Integer 成就总步骤(achievementType = 0 时,值为1) unlockNum Integer 解锁该成就的人数 unlockScale Double 解锁该成就的人数比例 unlockStatus Integer 解锁状态 1:解锁成就 0:尚未解锁 achievementFinishStep Integer 成就已完成的步数 unlockProgress Double 成就解锁进度 2、异常码 MiAchievementErrorCode异常码 含义 1000 服务器内部异常 1001 传入参数异常(例如成就id未空,上报成就不在游戏的发布的成就范围内等等) 1002 重复上传成就(例如已经解锁的的成就再次上传) 2001 SDK未初始化或初始化失败 2002 网络未连接 2003 上报成就或者获取成就数据超时 2004 其他异常情况 3001 初始化失败,用户未登录 3002 初始化失败,获取全部成就数据为空 3、Demopackage com.sdk.unity.migame.payment; /** * desc : 成就demo */ public class AchievementActivity extends Activity { private static final String TAG = "AchievementActivity"; private boolean showToast = true; private MiAchievementCallback mMiAchievementCallback = new MiAchievementCallback() { @Override public void onAchievementSDKInitSuccess() { //初始化成功 } @Override public void onAchievementSDKInitFail(int code, String msg) { //初始化失败 } @Override public void onAchievementStatusUpdate(MIAchievementBean bean, int code, String msg) { Log.i(TAG, "onAchievementStatusUpdate code=" + code + ",msg=" + msg + ",bean=" + bean); if (code == MiAchievementErrorCode.ACHIEVEMENT_SUCCES) { //成就上报成功 } else { //成就上报失败 } } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //....... MiAchievement.setShowToast(true);//设置显示冒泡弹窗 } /** * 成就初始化 * * @param view } */ public void achievementInit(View view) { MiAchievement.initData(); //SDK初始化,在登录后调用 } /** * 获取本地游戏成就信息 * * @param view */ public void getLocalAllAchievementList(View view) { List allAchievementList = MiAchievement.getLocalAllAchievementList(); } /** * 拉取服务游戏成就信息 * * @param view */ public void fetchAllAchievementList(View view) { MiAchievement.fetchAllAchievementList((list, code, msg) -> { Log.i(TAG, "fetchAllAchievementList code=" + code + ",msg=" + msg + ",list=" + list); if (code == MiAchievementErrorCode.ACHIEVEMENT_SUCCESS) { //获取成就数据成功 Toast.makeText(AchievementActivity.this, "拉取游戏所有成就数据成功", Toast.LENGTH_SHORT).show(); } else { //获取成就数据失败 Toast.makeText(AchievementActivity.this, "拉取游戏所有成就数据失败 code=" + code + ",msg=" + msg, Toast.LENGTH_SHORT).show(); } }); } /** * 获取玩家本地游戏成就信息 * * @param view */ public void getLocalUserAchievementList(View view) { List localUserAchievementList = MiAchievement.getLocalUserAchievementList(); Log.i(TAG, "getLocalUserAchievementList=" + localUserAchievementList); } /** * 拉取玩家服务端游戏成就信息 * * @param view */ public void fetchUserAchievementList(View view) { MiAchievement.fetchUserAchievementList(new GetAchievementListCallBack() { @Override public void onGetAchievementList(List list, int code, String msg) { Log.i(TAG, "fetchUserAchievementList code=" + code + ",msg=" + msg + ",list=" + list); if (code == MiAchievementErrorCode.ACHIEVEMENT_SUCCESS) { Toast.makeText(AchievementActivity.this, "拉取玩家游戏所有成就数据成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(AchievementActivity.this, "拉取玩家游戏所有成就数据失败 code=" + code + ",msg=" + msg, Toast.LENGTH_SHORT).show(); } } }); } /** * 达成成就 * * @param view */ public void reachAchievement(View view) { MiAchievement.reach("achievementId"); } /** * 上报增量分步式成就 * * @param view */ public void growSteps(View view) { MiAchievement.growSteps("achievementId", 10); } /** * 上报分步式整体进度 * * @param view */ public void makeSteps(View view) { MiAchievement.makeSteps("achievementId", 20); } /** * 设置冒泡开关 * * @param view */ public void setShowToast(View view) { MiAchievement.setShowToast(showToast); } }