《用户系统》

用户系统接口包含登录、注销、切换账号、平台中心、显示悬浮按钮、隐藏悬浮按钮、显示退出页、显示暂停页等渠道相关功能。

接入流程简要描述

  1. 使用用户系统在 AnySDK 初始化后必须马上设置监听类,监听回调信息。
  2. 捕捉到初始化完成的通知后根据需要调用登录,参见登录、注销。
  3. 在进入游戏时需要调用悬浮按钮,在暂停时需要调用隐藏悬浮按钮。
  4. 在游戏进入暂停或者游戏从后台恢复的时候,需要调用暂停页接口,参见显示暂停页。
  5. 在退出游戏的时候,需要调用退出页接口,参见显示退出页。
  6. 应用中需要有明显入口进入平台中心,详细 API 参见进入平台中心。
  7. 应用中需要接入切换账号入口,详细 API 参见进入平台中心。
  8. 在游戏销毁时调用 release 接口。
  9. 实现特殊渠道的特殊接口。

设置用户系统回调监听

用户系统存在回调信息,需要设置监听,开发者根据不同的回调实现游戏逻辑。

AnySDKUser.getInstance().setListener(new AnySDKListener() {
    @Override
    public void onCallBack(int code, String msg) {
        switch(code)
        {
        case UserWrapper.ACTION_RET_INIT_SUCCESS://初始化SDK成功回调
            //login方法需要在初始化成功之后调用
            break;
        case UserWrapper.ACTION_RET_INIT_FAIL://初始化SDK失败回调
            //尝试重新初始化,或者退出游戏
            break;
        case UserWrapper.ACTION_RET_LOGIN_SUCCESS://登录成功回调
            //可使用getUserID()获取用户ID
            break;
        case UserWrapper.ACTION_RET_LOGIN_TIMEOUT://登录超时回调
            break;
        case UserWrapper.ACTION_RET_LOGIN_CANCEL://登录取消回调
            break;
        case UserWrapper.ACTION_RET_LOGIN_FAIL://登录失败回调
            break;
        case UserWrapper.ACTION_RET_LOGOUT_SUCCESS://登出成功回调
            //一般可以做初始化游戏,并且重新调用登录接口操作
            break;
        case UserWrapper.ACTION_RET_LOGOUT_FAIL://登出失败回调
            break;
        case UserWrapper.ACTION_RET_PLATFORM_ENTER://平台中心进入回调
            break;
        case UserWrapper.ACTION_RET_PLATFORM_BACK://平台中心退出回调
            break;
        case UserWrapper.ACTION_RET_PAUSE_PAGE://暂停界面回调
            break;
        case UserWrapper.ACTION_RET_EXIT_PAGE://退出游戏回调
            //参考下方退出界面文档
            break;
        case UserWrapper.ACTION_RET_ANTIADDICTIONQUERY://防沉迷查询回调
            break;
        case UserWrapper.ACTION_RET_REALNAMEREGISTER://实名注册回调
            break;
        case UserWrapper.ACTION_RET_ACCOUNTSWITCH_SUCCESS://切换账号成功回调
            //一般可以做重新获取用户ID,和初始化游戏操作
            break;
        case UserWrapper.ACTION_RET_ACCOUNTSWITCH_FAIL://切换账号失败回调
            break;
        default:
            break;
        }
    }
});

LOGOUT与ACCOUNTSWITCH回调的区别:如果退出账号后,SDK再拉取登录,登录完成后再给的回调,则AnySDK这边返回ACCOUNTSWITCH的回调。此时可以获取到新的用户ID,若用户ID和之前不同可以初始化游戏重新进入。若SDK只是退出账号,则给LOGOUT回调,用户需要重新调用Login方法用于登录。

相关接口

初始化

在加载插件的同时已经对所有 SDK 进行了初始化,开发者不需要额外再进行初始化。
回调信息:

回调信息 code msg
初始化成功 ACTION_RET_INIT_SUCCESS null 或者错误信息的简单描述
初始化失败 ACTION_RET_INIT_FAIL null 或者错误信息的简单描述

登录

一、登录流程描述
登录流程

  1. 游戏客户端调用登录接口(向渠道平台服务器发起登录请求)
  2. 用户登录成功,渠道平台服务器返回认证码
  3. AnySDK 框架拿着认证码向游戏服务器请求登录验证
  4. 游戏服务器将认证码转发给 AnySDK 服务器
  5. AnySDK 服务器向渠道平台服务器进行用户登录验证
  6. AnySDK 服务器接收验证结果
  7. AnySDK 服务器将结果转发给游戏服务器
  8. 游戏服务器通知 AnySDK 框架登录验证结果
  9. AnySDK 框架回调给游戏客户端是否登录成功

二、登录函数
一定要接到初始化SDK成功回调,才可以调登录接口的函数
方法一:login();
方法二:login(info); //param:info(Map<String, String>)
登陆参数可以传入一个 map,可传入服务器 ID(server_id)、登陆验证地址(server_url)和透传参数(任意 key 值)。
服务器 ID:key 为 server_id,服务端收到的参数名为 server_id,不传则默认为 1。
登陆验证地址:key 为 server_url,传入的地址将覆盖掉配置的登陆验证地址。
透传参数:key 任意(以上两个 key 除外),服务端收到的参数名为 server_ext_for_login,是个 json 字符串。
PS:AnySDK 客户端 渠道参数登陆验证透传参数,服务端收到的参数名为 server_ext_for_client

Map<String, String> info = new HashMap<String, String>();
info.put("server_id", "2");
info.put("server_url", "http://xxx.xxx.xxx");
info.put("key1", "value1");
info.put("key2", "value2");
AnySDKUser.getInstance().login(info);

在成功初始化插件结束后,您就可以开始调用登录接口了。

登录回调信息:

回调信息 code msg
登录成功 ACTION_RET_LOGIN_SUCCESS 游戏服务端回传给客户端数据的 ext 字段
登录失败 ACTION_RET_LOGIN_FAIL null 或者错误信息的简单描述
登录网络出错 ACTION_RET_LOGIN_TIMEOUT null 或者错误信息的简单描述
登录取消 ACTION_RET_LOGIN_CANCEL null 或者错误信息的简单描述

三、当前登录状态
bool isLogined()
您可以通过调用该函数来判断是否已经登录。

四、获取用户唯一标示符
std::string getUserID()
用户唯一标示符。

登出

void logout();
注销账号分两种,一种是由开发者在任何场景调用,用来注销当前的登录账号,渠道不一定提供该方法,需要先判断是否支持该方法;另一种是由玩家在平台界面里面选择注销/切换当前的账号,根据SDK的表现来给出LOGOUT/ACCOUNTSWITH回调。 登出回调信息:

回调信息 code msg
登出成功 ACTION_RET_LOGOUT_SUCCESS null 或者错误信息的简单描述
登出失败 ACTION_RET_LOGOUT_FAIL null 或者错误信息的简单描述

举例说明:

//调用用户系统登出功能
if (AnySDKUser.getInstance().isFunctionSupported("logout")) {
    AnySDKUser.getInstance().callFunction("logout");
}

进入平台中心

void enterPlatform();
进入平台中心的首页界面。
回调信息:

回调信息 code msg
进入平台中心 ACTION_RET_PLATFORM_ENTER null 或者错误信息的简单描述
退出平台中心 ACTION_RET_PLATFORM_BACK null 或者错误信息的简单描述

举例说明:

//调用用户系统进入平台中心功能
if (AnySDKUser.getInstance().isFunctionSupported("enterPlatform")) {
    AnySDKUser.getInstance().callFunction("enterPlatform");
}

显示悬浮工具栏

void showToolBar(ToolBarPlace place)
place:浮动工具栏初始位置,仅第一次进入时有效,之后工具栏会显示在用户最后一次停留的位置,共有 6 个值可以设置。

对应的状态码 描述
ToolBarPlaceEnum.kToolBarTopLeft value = 1;左上角
ToolBarPlaceEnum.kToolBarTopRight value = 2;右上角
ToolBarPlaceEnum.kToolBarMidLeft value = 3;左边中间
ToolBarPlaceEnum.kToolBarMidRight value = 4;右边中间
ToolBarPlaceEnum.kToolBarBottomLeft value = 5;左下角
ToolBarPlaceEnum.kToolBarBottomRight value = 6;右下角

举例说明:

AnySDKParam param = new AnySDKParam(ToolBarPlaceEnum.kToolBarTopLeft.getPlace());
AnySDKUser.getInstance().callFunction("showToolBar", param);

隐藏悬浮工具栏

void hideToolBar()
举例说明:

//在暂停时隐藏悬浮按钮
if (AnySDKUser.getInstance().isFunctionSupported("hideToolBar")) {
    AnySDKUser.getInstance().callFunction("hideToolBar");
}

切换账号

void accountSwitch()
切换账号分两种情况,一种是由开发者在一些场景调用,用来注销当前的登录账号,渠道不一定提供该方法,需要先判断是否支持该方法;另一种是由玩家在平台界面里面,选择退出/切换当前的账号,根据SDK的表现来给出LOGOUT/ACCOUNTSWITH回调。

LOGOUT与ACCOUNTSWITCH回调的区别:如果退出账号后,SDK再拉取登录,登录完成后再给的回调,则AnySDK这边返回ACCOUNTSWITCH的回调。此时可以获取到新的用户ID,若用户ID和之前不同可以初始化游戏重新进入。若SDK只是退出账号,则给LOGOUT回调,用户需要重新调用Login方法用于登录。 回调信息:

回调信息 code msg
切换账号成功 ACTION_RET_ACCOUNTSWITCH_SUCCESS null 或者错误信息的简单描述
切换账号失败 ACTION_RET_ACCOUNTSWITCH_FAIL null 或者错误信息的简单描述

举例说明:

//用户系统调用切换账号功能
if (AnySDKUser.getInstance().isFunctionSupported("accountSwitch")) {
    AnySDKUser.getInstance().callFunction("accountSwitch");
}

退出界面

void exit()
游戏退出时调用该函数。
注意:部分渠道 SDK 要求必须显示渠道的退出界面,例如在返回键或游戏退出按钮调用此接口。
回调信息:

回调信息 code msg
渠道退出界面回调 ACTION_RET_EXIT_PAGE null 或者错误信息的简单描述
游戏退出界面回调 ACTION_RET_GAME_EXIT_PAGE null 或者错误信息的简单描述

举例说明:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
     if(keyCode == KeyEvent.KEYCODE_BACK){
         if (AnySDKUser.getInstance().isFunctionSupported("exit")) {
             AnySDKUser.getInstance().callFunction("exit");
             return true;
        }
        else
        {
            //弹出游戏退出界面
        }
    }
    return super.onKeyDown(keyCode, event);
}

回调函数处理:

switch(arg0)
{
    case UserWrapper.ACTION_RET_EXIT_PAGE://退出游戏回调
        if(arg1 == "onGameExit" || arg1 == "onNo3rdExiterProvide")
        {
            //弹出游戏退出界面
        }
        else
        {
            //执行游戏退出逻辑
        }
        break;
    case UserWrapper.ACTION_RET_GAME_EXIT_PAGE:
        //弹出游戏退出界面
        break;
}

PS:个别 SDK 有游戏退出和渠道退出两个回调,请在 msg 为 "onGameExit"(豌豆荚)或 "onNo3rdExiterProvide"(有米)弹出游戏退出界面,以后将改成新加的回调 code。

暂停界面

void pause()
游戏暂停时调用该函数(目前好像除了 Android 百度游戏单机、iOS 百度 91,没有别的 SDK 有这个了)。
回调信息:

回调信息 code msg
关闭暂停界面 ACTION_RET_PAUSE_PAGE null 或者错误信息的简单描述

举例说明:

//判断是否由后台切回
public boolean isAppOnForeground() {
    ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    String packageName = getApplicationContext().getPackageName();
    List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
    if (appProcesses == null)
        return false;
    for (RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.processName.equals(packageName)
    && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            return true;
            }
    }
    return false;
} 
private boolean isAppForeground = true;

@Override
protected void onStop() {
    super.onStop();
    if(!isAppOnForeground()){
        isAppForeground = false;
    }
}   
@Override
protected void onResume() { 
    super.onResume();
    if(!isAppForeground){
        AnySDKUser.getInstance().callFunction("pause");
        isAppForeground = true;     
    }
}

特殊渠道接口

实名注册

void realNameRegister()
功能说明:
提供实名注册接口,当游戏方调用防沉迷查询接口时,发现用户未填写实名注册信息时,可调用该接口发起实名注册。例如:360、华为、联想。
回调信息:

回调信息 code msg
实名注册回调 ACTION_RET_REALNAMEREGISTER 实名注册结果

结果返回 msg
{"status":"success",msg:""}

字段 描述
status success 成功,cancel 取消,fail 失败
msg SDK 返回的信息
//用户系统调用实名注册
(AnySDKUser.getInstance().isFunctionSupported("realNameRegister"))
{
    AnySDKUser.getInstance().callFunction("realNameRegister");
}

防沉迷查询

void antiAddictionQuery()
功能说明:
防沉迷系统是中国法律对网游管理的要求,因此游戏必须接入防沉迷查询和实名注册接口。 使用方法:游戏方调用防沉迷查询接口,查询该用户是否已经成年。例如:360、百度、华为、联想。
1、若已成年,则允许用户正常游戏,不做任何提醒。
2、若未成年,或未实名注册的用户将受到防沉迷系统的限制。

开发细则:
游戏过程,会提示游戏用户的累计在线时间。
累计游戏时间超过 3 小时,游戏收益(经验,金钱)减半。此后,每 30 分钟警示一次。累计游戏 时间超过 5 小时,游戏收益为 0。此后,每 15 分钟警示一次。如果未成年人的累计下线时间已满 5 小时,则累计在线时间清零,如再上线则重新累计在线时间。 详细开发标准请参考:http://baike.baidu.com/view/3615996.htm

接口说明:
防沉迷查询接口可查询用户当前的防沉迷状态,0 为无用户信息,此时需要调用实名注册接口,要求用户进行实名注册。若用户不进行实名注册,则同样视为未满 18 岁的用户,要受到防沉迷系统的限制。
1 为未成年,当游戏时长达到警戒状态时,需要出防沉迷提示;2 为已成年,不受防沉迷系统的干扰。

回调信息:

回调信息 code msg
防沉迷查询结果回调 ACTION_RET_ANTIADDICTIONQUERY 防沉迷查询结果

结果返回 msg
{"status":"success","result":"0","msg":""}

字段 描述
status success 成功,fail 失败
result 0 无此用户数据,1 未成年,2 已成年
msg SDK 返回的信息
//用户系统调用防沉迷查询
if(AnySDKUser.getInstance().isFunctionSupported("antiAddictionQuery"))
{
    AnySDKUser.getInstance().callFunction("antiAddictionQuery");
}

提交游戏数据接口

void submitLoginGameRole(Map<String, String> data) 功能说明:
把游戏数据传递到 SDK 服务端,例如 UC、上海益玩、pps、oppo、37 玩、飞流、vivo、靠谱助手、松果游戏、玉米助手等 SDK 需要。

接口说明:
记录了一些游戏的相关信息,开发者需要提供如下参数:

参数 是否必传 参数说明
dataType Y 数据类型,1为进入游戏,2为创建角色,3为角色升级,4为退出
roleId Y 角色 ID
roleName Y 角色名称
roleLevel Y 角色等级
zoneId Y 服务器 ID
zoneName Y 服务器名称
balance Y 用户余额(RMB 购买的游戏币)
partyName Y 帮派、公会等
vipLevel Y VIP 等级
roleCTime Y 角色创建时间(单位:秒)(历史角色没记录时间的传 -1,新创建的角色必须要)
roleLevelMTime Y 角色等级变化时间(单位:秒)(创建角色和进入游戏时传 -1)

举例说明:

if(AnySDKUser.getInstance().isFunctionSupported("submitLoginGameRole"))
{
    Map<String, String> map = new HashMap<String, String>();
    map.put("dataType", "1");
    map.put("roleId", "123456");
    map.put("roleName", "test");
    map.put("roleLevel", "1");
    map.put("zoneId", "1");
    map.put("zoneName", "test");
    map.put("balance", "1");
    map.put("partyName", "test");
    map.put("vipLevel", "1");
    map.put("roleCTime", "1480318110");
    map.put("roleLevelMTime", "-1");

    AnySDKParam param = new AnySDKParam(map);
    AnySDKUser.getInstance().callFunction("submitLoginGameRole",param);
}

【评论区】