SDK介绍 1

  • 安卓 SDK用于安卓游戏联运,主要提供用户系统、支付系统、游戏攻略、游戏礼包等功能。
  • 安卓 SDK接入配置SDK版本,minSdkVersion大于等于16,targetSdkVersion小于等于28。

注意事项

  • 接口参数大小写敏感
  • request 和 response的编码格式均为 UTF-8

前期准备

1.SDK接入技术人员仔细阅读该对接文档

2.下载SDK-DEMO示例 下载,获取xiaokrlib工程

3.CP提供支付回调地址。

4.获取小氪平台配置参数:

字段 描述
XK_APPID app_id(游戏ID)
XK_CLIENTID client_id(客户端ID)
XK_CLIENTKEY client_key(客户端KEY)
XK_AGENT 渠道标识(SDK默认值)
XK_GAMEVERSION 游戏版本号(以接入的游戏版本为准,格式为三位比如:实际游戏版本为:2.0,则需要输入2.0.0)
XK_SDKVERSION sdk版本号(一般不需要修改)
XK_BAIDUID 百度APPID(如果小氪平台不提供则默认填0)
XK_BAIDUKEY 百度KEY (如果小氪平台不提供则默认填空)

接入步骤

安卓 SDK导入

SDK自2.0.0版本开始,提供Android Studio版本对接示列.

Android studio方式:

引入小氪SDK提供的(xiaokrlib)工程, (xiaokrlib是基于Android Sttudio开发)
具体流程如下:

  • 选择File->New->Import Module->选择xiaokrlib导入.
  • 将xiaokrlib的AndroidManifest中(XK_APPID、XK_CLIENTID、XK_CLIENTKEY、XK_GAMEVERSION、XK_BAIDUID、XK_BAIDUKEY)替换为:从本平台获取的数据(XK_AGENT、XK_SDKVERSION可以不修改)
  • xiaokrlib的AndroidManifest中provider设置的包名需要替换成游戏主包名
    替换包名

  • sdk的assets目录下的图片文件《kprogresshud_spinner.png》确保引入,不然会导致微信无法支付.

  • sdk的assets目录下《supplierconfig.json》确保引入,不然会导致设备重要标识无法获取.
  • 退出接口请务必调用
  • 注意: 如果小氪平台提供了XK_BAIDUID和XK_BAIDUKEY,请务必配置到manifest文件,并且在Application中调用对应接口:
     YTSDKManager.xkInitApplication(getApplicationContext());
    

接口调用

1. SDK横竖屏设置

设置横竖屏设置一次生效,默认情况下是竖屏展示,必须在登录前调用设置方法,不然会出现页面展示异常

    //设置竖屏展示
    YTSDKManager.setScreenViewStatus(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,SDKActivity.this);
    //设置横屏展示
    YTSDKManager.setScreenViewStatus(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,SDKActivity.this);
    //设置日志打印 正式上线需要替换成flase
    Logger.setLog(true);

2. 权限回调接口

sdk内部会申请相关权限,需要在游戏页面(onRequestPermissionsResult)中回调sdk接口,

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //权限回调 cp必须在这个方法中调用SDK接口。
        Logger.msg("授权回调" + requestCode);
        YTSDKManager.requestPermissionResult(requestCode, permissions, grantResults);
    }

3. SDK初始化

ttwsdkmanager = YTSDKManager.getInstance(this,new InitCallback() {

            @Override
            public void onInitSuccess(String arg0) {
                // TODO Auto-generated method stub
                //如果需要自动登录请在此处添加登录相关接口
            }

            @Override
            public void onInitFail(String arg0) {
                // TODO Auto-generated method stub
            }
        })

调用初始化之前必须确保:

1.上下文路径必须为Activity实例.

2.AndroidManifest.xml 中的AppID等配置参数为当前游戏参数。

4. SDK登录

 ttwsdkmanager.showLogin(this, true, new OnLoginListener() {
            @Override
            public void loginSuccess(LogincallBack logincallback) {
                // TODO Auto-generated method stub111
                System.out.println("登录成功");
                 if(logincallback!=null){
                    String user_id = logincallback.mem_id;
                    String user_token = logincallback.user_token;
                    boolen isChangeAccount = logincallback.changeAccount //切换账号
                    if (logincallback.changeAccount) {
                        //isChangeAccount如果等于true表面当前回调是为切换账号操作,游戏可以做退出当前角色游戏画面。
                        //也可以不做操作,由接入方自行操作。
                        Toast.makeText(YTSDKActivity.this, "切换账号回调,退出游戏画面进入游戏引导页", Toast.LENGTH_SHORT).show();
                    } else {
                        //登录成功进入游戏
                    }
                }
            }

            @Override
            public void loginError(LoginErrorMsg errorMsg) {
                // TODO Auto-generated method stub
                if (errorMsg != null) {
                    Toast.makeText(SDKActivity.this, errorMsg.msg,
                            Toast.LENGTH_SHORT).show();
                }

            }
        });

调用登录必须确保:
1.SDK初始化完成,否则将无法登录。

5. 创建角色

ttwsdkmanager.addUserRole(this, "区服名称", "区服ID", "角色名称", "角色ID", "9999","VIP等级",
                new RolekCallback() {

                    @Override
                    public void onSuccess(Object responseString) {
                        // TODO Auto-generated method stub 正式游戏接入时不需要Toast
                        Toast.makeText(SDKActivity.this, "创角信息提交成功",
                                Toast.LENGTH_SHORT).show();
                        // 接口调用成功 响应结果在这里
                    }

                    @Override
                    public void onFailure(Object failureString) {
                        // TODO Auto-generated method stub
                    }
                });

为了小氪SDK平台更好的获取有用数据,所以游戏接入时务必接入此接口。

6. 角色升级

ttwsdkmanager.upGradeRole(this, "区服名称", "区服ID", "角色名称", "角色ID", "9999","VIP等级",
                new RolekCallback() {

                    @Override
                    public void onSuccess(Object responseString) {
                        // TODO Auto-generated method stub 正式游戏接入时不需要Toast
                        // 接口调用成功 响应结果在这里
                    }

                    @Override
                    public void onFailure(Object failureString) {
                        // TODO Auto-generated method stub
                        tv_userRole.setClickable(true);
                    }
                });

为了小氪SDK平台更好的获取有用数据,所以游戏接入时务必接入此接口。

7. 游戏购买道具支付

ttwsdkmanager.showPay(this, "cp订单号", money, "产品ID","产品名称", "产品详情", "角色ID","区服ID","区服名称","角色名称" "拓展参数",
                new OnPaymentListener() {
                    @Override
                    public void paymentSuccess(PaymentCallbackInfo callbackInfo) {
                        // TODO Auto-generated method stub
                        Toast.makeText(
                                getApplication(),
                                "支付金额数:" + callbackInfo.money + " 消息提示:"
                                        + callbackInfo.msg, Toast.LENGTH_LONG)
                                .show();
                    }

                    @Override
                    public void paymentError(PaymentErrorMsg errorMsg) {
                        // TODO Auto-generated method stub
                        Toast.makeText(
                                getApplication(),
                                "支付失败:code:" + errorMsg.code + "  ErrorMsg:"
                                        + errorMsg.msg + "  预支付的金额:"
                                        + errorMsg.money, Toast.LENGTH_LONG)
                                .show();
                    }
                });

调用支付必须确保:

1.SDK的assets目录下必须有(kprogresshud_spinner.png)资源文件,不然将无法调起微信支付。

8. 游戏退出

ttwsdkmanager.doOutAdavert(this, true, new GameOutCallback() {

                @Override
                public void onSuccess() {
                    // TODO Auto-generated method stub
                    SDKActivity.this.finish();
                }

                @Override
                public void onFail() {
                    // TODO Auto-generated method stub
                    Log.i("点击取消", "取消");
                }
            });

为了保证游戏正常运行和更好的游戏体验请务必在窗口关闭时手动调用

9.实名认证接口

ttwsdkmanager.showRealName(this, new RealNameCallback() {

            @Override
            public void onRealSuccess(String arg0) {
                // TODO Auto-generated method stub
                //返回格式:{"drvId":"身份证号码","age":"年龄"}
                Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onRealFail(String arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
            }
        });

该接口必须保证用户已经登录,所以建议在登录完成之后的回调中调用。

10.拓展接口

    //onCreate方法中调用
    YTSDKManager.onCreateSdk(YTSDKActivity.this);
    //onWindowFocusChanged方法中调用
    YTSDKManager.onWindowFocusChangedSdk(YTSDKActivity.this);
    //onResume方法中调用
    YTSDKManager.onResumeSdk(YTSDKActivity.this);
    //onPause方法中调用
    YTSDKManager.onPauseSdk(YTSDKActivity.this);
    //onDestroy方法中调用
    YTSDKManager.onDestroySdk(YTSDKActivity.this);

以上接口用于拓展需求,用于运营统计游戏数据,如果CP支持回调则必须接入,会影响游戏运营数据

11.切换账号

ttwsdkmanager.switchAccount(YTSDKActivity.this, new OnLoginListener() {
            @Override
            public void loginSuccess(LogincallBack logincallback) {
                // TODO Auto-generated method stub111
                ttwsdkmanager.showRealName(YTSDKActivity.this, new RealNameCallback() {
                    @Override
                    public void onRealSuccess(String success) {
                        Logger.msg(success);
                        Toast.makeText(YTSDKActivity.this, success, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onRealFail(String fail) {
                        Logger.msg(fail);
                        Toast.makeText(YTSDKActivity.this, fail, Toast.LENGTH_SHORT).show();
                    }
                });
                Toast.makeText(YTSDKActivity.this, "游戏回调登录成功", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void loginError(LoginErrorMsg errorMsg) {
                // TODO Auto-generated method
                if (errorMsg != null) {
                    Toast.makeText(YTSDKActivity.this, "游戏回调" + errorMsg.msg,
                            Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(YTSDKActivity.this, "游戏回调登录失败", Toast.LENGTH_SHORT).show();
                }

            }
        });

该接口用于在游戏中切换账号调用,调用接口会弹出登录窗口。

12.Application初始化接口

YTSDKManager.xkInitApplication(getApplicationContext());
  • 该接口必须在程序Application的oncreat()方法中调用,否则不能正确执行。
  • 如果小氪平台没有提供XK_BAIDUID和XK_BAIDUKEY参数,可不调用此接口。
  • 游戏包包名必须与小氪提供包名保持一致。

接口说明

1.SDK初始化

SDK提供工具类YTSDKManager,游戏接入必须获取该类实例。 获取实例方法:

//方法1
YTSDKManager.getInstance(Activity context)
//方法2
YTSDKManager.getInstance(Activity context,InitCallback callback)

初始化SDK时需要调用(方法2),需要监听初始化成功与失败回调。
初始化成功后如果当前YTSDKManager对象没有调用过destroy()方法,那么想再次获取YTSDKManager实例,只需调用(方法1)即可。
YTSDKManager.getInstance(Activity context)可以多次调用,不会影响程序运行性能.

注: 1.参数Context必须为游戏的Activity. 2.初始化强烈推荐使用(方法2)调用.

2.登录/注册

完成SDK初始化后,通过获取到的实例调用登录接口,当用户第一次安装时会调起登录窗口:
登录窗口提供一下功能:

  • 一键注册
  • 手机注册
  • 短信验证码登录
  • 找回密码
    如果用户有登录过,会根据接口传递的参数判断是否进行自动登录,自动登录会延迟二秒执行登录操作,以便于用户进行切换账户。
    SDK登录成功后默认展示浮标。

接口定义

public void showLogin(acontext, Boolean isShowQuikLogin,OnLoginListener loginlistener)

参数说明

参数名 类型 参数说明
acontext Context 上下文路径
isShowQuikLogin boolen 是否显示快捷登录,true为快捷登录/false不显示快捷登录
onloginListener OnLoginListener 登录接口回调

回调说明

loginSuccess(LogincallBack logincallback) //登录成功

loginError(LoginErrorMsg logincallback) //登录失败
  • LogincallBack:
参数名 类型 参数说明
mem_id String 登录成功后用户ID(唯一)
user_toke String 用户toke(唯一用户服务端校验)
changeAccount boolean 账号切换
  • loginError:
参数名 类型 参数说明
code int 登录失败错误码
msg String 登录失败的消息提示

完整示例

sdkManager.showLogin(this, true, new OnLoginListener() {
    @Override
    publicvoid loginSuccess(LogincallBack logincallback) {
        //登录成功
        if(logincallback!=null){
            String user_id = logincallback.mem_id;
            String user_token = logincallback.user_token;
            boolen isChangeAccount = logincallback.changeAccount //切换账号
            if (logincallback.changeAccount) {
                //isChangeAccount如果等于true表面当前回调是为切换账号操作,游戏可以做退出当前角色游戏画面。
                //也可以不做操作,由接入方自行操作。
                Toast.makeText(YTSDKActivity.this, "切换账号回调,退出游戏画面进入游戏引导页", Toast.LENGTH_SHORT).show();
            } else {
                //登录成功进入游戏
            }
        }
    }

    @Override
    publicvoid loginError(LoginErrorMsg errorMsg) {
        if(errorMsg!=null){
            // 登录失败的借口回调,CP自行调用
            intcode = errorMsg.code;// 登录失败的状态码
            String msg = errorMsg.msg;// 登录失败的消息提示
        }
    }
});

3.购买道具

在完成初始化并已经获取到SDK实例的情况下,购买游戏内道具时调用此接口,为游戏提供支付系统。
小氪安卓SDK提供多种稳定支付方式,由小氪平台自行控制。

接口定义

public void showPay(Context ctx,String cp_order_id, String money,String productId, String productName, String productDesc, 
String roleId,String serverId, String serverName, String roleName, String attach, OnPaymentListener paymentListener)

参数说明

参数名 类型 参数说明
ctx String 上下文路径(必传)
cp_order_id String CP订单号
money String 支付金额(必传)
productId String 产品ID(必传)
productName String 商品名称(必传)
productDesc String 商品明细 (必传)
roleId String 角色ID(必传)
serverId String 区服ID(必传)
serverName String 区服名称
roleName String 角色名称
attach String 扩展信息(必传CP订单号)
paymentListener OnPaymentListener 支付客户端回调接口(必传)

回调说明

paymentSuccess(PaymentCallbackInfo callbackInfo) //支付成功  

paymentError(PaymentErrorMsg errorMsg) //支付失败
  • PaymentCallbackInfo:
参数名 类型 参数说明
msg String 支付结果文字描述
money String 支付金额
  • PaymentErrorMsg:
参数名 类型 参数说明
code int 支付失败错误码
msg String 支付失败的消息提示
money String 支付金额

完整示例

sdkManager.showPay(this, System.currentTimeMillis() + "", money,
                "产品ID", "产品名称", "产品详情",
                "角色ID", "区服ID", "区服名称", "角色名称", "拓展参数" ,new OnPaymentListener() {
    @Override
    publicvoid paymentSuccess(PaymentCallbackInfo callbackInfo) {
        if(callbackInfo!=null){
            double money = callbackInfo.money;
            String msg = callbackInfo.msg;
        }
    }

    @Override
    publicvoid paymentError(PaymentErrorMsg errorMsg) {
        // TODO Auto-generated method stub
        if(errorMsg!=null){
            int code = errorMsg.code;
            double money = errorMsg.money;
            String msg = errorMsg.msg;
        }
        // 弹出支付失败信息,一般不用
        /*
         * Toast.makeText( getApplication(), "充值失败:code:" +
         * errorMsg.code + "  ErrorMsg:" + errorMsg.msg +
         * "  预充值的金额:" + errorMsg.money,
         * Toast.LENGTH_LONG).show();
         */
    }
});

4. 创角

在完成初始化并已经获取到SDK实例的情况下,用户创建角色时调用。

注:小氪平台需要进行数据分析,因此该接口请务必调用

接口定义

public void addUserRole(final Context context, final String serverName,
final String serverId, final String roleName, final String roleId,final String roleGrade, String roleVipGrade, final RolekCallback roleCallBack)

参数说明

参数名 类型 参数说明
context Context 上下文路径(必传)
serverName String 区服名称(必传)
serverId String 区服ID(必传)
roleName String 角色名称(必传)
roleId String 角色ID(必传)
roleGrade String 角色等级 (必传)
roleVipGrade String VIP等级
roleCallBack RolekCallback 客户端回调接口(必传)

回调说明

onSuccess(Object responseString) //提交成功 

onFailure(Object failureString) //提交失败

创角接口在后台提交,对接过程中不需要处理上报结果, 为了不影响用户游戏体验,不管上报失败还是成功尽量不要弹出提示。

完整示例

ttwsdkmanager.addUserRole(this, "区服名称", "区服ID", "角色名称", "角色ID", "9999","VIP等级"
                new RolekCallback() {
                    @Override
                    public void onSuccess(Object responseString) {
                        // TODO Auto-generated method stub
                           // 正式游戏不要弹Toast
                        Toast.makeText(YTSDKActivity.this, "创角信息提交成",
                            Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onFailure(Object failureString) {
                        // TODO Auto-generated method stub
                    }
                });

5. 游戏退出

  • 游戏退出时调用接口,在已经获取到SDK实例的情况下退出游戏时调用。
  • 此接口用于SDK资源回收内存释放,为了游戏性能、用户体验,必须调用此接口。
  • 游戏退出接口弹出"是否退出游戏窗口",用户点击会执行相应的回调方法。

接口定义

doOutAdavert(Context context, boole canBack,  GameOutCallback callBack)

参数说明

参数名 类型 参数说明
context Context 上下文路径(必传)
canBack boole 是否允许返回(必传)
callBack GameOutCallback 用户点击回调(必传)

回调说明

onSuccess() //点击确认 

onFail() //点击取消

完整示例

 ttwsdkmanager.doOutAdavert(this, true, new GameOutCallback() {

        @Override
        public void onSuccess() {
            // TODO Auto-generated method stub
            YTSDKActivity.this.finish();
        }

        @Override
        public void onFail() {
            // TODO Auto-generated method stub
            Logger.msg("点击再玩一会 = " + "再玩一会");
        }
    });

6. 实名认证

  • 游戏如果使用sdk提供的实名认证功能,必须调用此接口。
  • 实名认证接口调用必须保证用户已经完成登陆
  • 实名认证接口会根据当前用户是否实名认证回调给游戏身份证信息和年龄信息。

接口定义

showRealName(Context context, RealNameCallback callback )

参数说明

参数名 类型 参数说明
context Context 上下文路径(必传)
canBack RealNameCallback 实名认证结果回调(必传)

回调说明

//实名认证返回结果
//3、用户已经实名认证,则返回实际身份证和年龄
onRealSuccess() 

onRealFail() //点击其他异常情况会走此方法。返回字符串异常case

完整示例

 ttwsdkmanager.showRealName(this, new RealNameCallback() {

            @Override
            public void onRealSuccess(String arg0) {
                // TODO Auto-generated method stub
                //{"drvId":"身份证号码","age":年龄(整型)}
                Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onRealFail(String arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(SDKActivity.this,arg0,Toast.LENGTH_SHORT).show();
            }
        });

7.切换账号

用于在游戏中切换账号

接口定义

public void switchAccount(Activity acontext, OnLoginListener loginlistener)

参数说明

参数名 类型 参数说明
acontext Activity 上下文路径
onloginListener OnLoginListener 登录接口回调

回调说明

loginSuccess(LogincallBack logincallback) //登录成功

loginError(LoginErrorMsg logincallback) //登录失败
  • LogincallBack:
参数名 类型 参数说明
mem_id String 登录成功后用户ID(唯一)
user_toke String 用户toke(唯一用户服务端校验)
  • loginError:
参数名 类型 参数说明
code int 登录失败错误码
msg String 登录失败的消息提示

完整示例

sdkManager.switchAccount(this, new OnLoginListener() {
    @Override
    publicvoid loginSuccess(LogincallBack logincallback) {
        //登录成功
        if(logincallback!=null){
            String user_id = logincallback.mem_id;
            String user_token = logincallback.user_token;
        }
    }

    @Override
    publicvoid loginError(LoginErrorMsg errorMsg) {
        if(errorMsg!=null){
            // 登录失败的借口回调,CP自行调用
            intcode = errorMsg.code;// 登录失败的状态码
            String msg = errorMsg.msg;// 登录失败的消息提示
        }
    }
});

混淆

SDK核心代码是以jar包及资源文件提供给CP的,其中jar包已经半混淆状态。
您在混淆自己APK包的时候请不要将game_sdk-xx的jar包再次混淆,若被混淆后可能会出现其他错误。
您可以在用ant构建混淆包的build.xml里面对应位置或者在proguard.cfg里加入:-libraryjarslibs/.jar以避免jar包被混淆。

SDK其他引用的第三方框架尽可能的不进行二次混淆
微信支付混淆:-keep class com.ipaynow.plugin.** {
;}
数美混淆: -keep class com.ishumei.* { ; }

FAQ

初始化提示接口校验不通过

检查本地清单文件配置(APPID、CLIENTID、CLIENTKEY)是否配置正确

充值回调失败

检查提供的回调地址是否正确,接口请求格式是否正确。

微信支付无法启动微信

检查SDK中的Assets目录下的资源文件(kprogresshud_spinner.png)是否存在。

登录接口调用二次才弹出登录页问题

接入过程中,需要先调用YTSDKManager.getInstance(activity)初始化,再去调用showLogin(),请使用带回调的接口实现初始化,YTSDKManager.getInstance(this, new InitCallback() {})

支付宝支付无法拉起支付

请检查所引用的支付宝jar版本是否跟SDK保持一致。是否有支付宝第三方包冲突。

微信支付提示动态库加载失败

检查第三方jar包是否被二次混淆。添加-keep class com.ipaynow.plugin.* {;}

results matching ""

    No results matching ""