安卓游戏对接文档

一、版本记录

  1. 版本记录

    版本号修改记录
    v4.2增加分发功能
    v4.3.1修复bug
    v4.4修复bug
    v4.5.1调整界面ui
    v4.5.2新增二维码公告页,修复弹框异常
    v4.5.3新增二维码公告页,修复弹框异常
    v4.5.4调整闪屏出现的时机,修复快手出现的异常
    v4.5.5优化生成支付订单流程
    v4.5.6修复接入下游渠道登录校验失败后弹框异常的问题

二、环境配置

  1. 导入资源

    引入demo中的mylibrary,点击android studio左上角的File->New->Import Module,选择demo中的mylibrary

    或者是手动导入,拷贝mylibrary的libs、layout、xml三个文件夹的文件到工程中,拷贝AndroidManifest.xml中的权限申明、application到工程中,主题样式最好是全屏,      application一定要配置属性android:usesCleartextTraffic="true"。layout目录下的float_webview.xml、float_webview_new.xml、floating_menu.xml这三个文件一定要拷贝

     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
        <uses-permission android:name="android.permission.READ_CLIPBOARD_HISTORY"></uses-permission>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_SENSORS" />
    
        <application
            android:usesCleartextTraffic="true"
            android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"
            android:networkSecurityConfig="@xml/network_security_config">
    
        </application>
    </manifest>
  2. 配置参数

    在工程中的AndroidManifest.xml中配置参数,如下方所示

          <activity
        android:name="com.bstsdk.sdkdemo.MainActivity"
        android:exported="true">
        <!-- 用于应用启动的intent-filter -->
        <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        </activity>
        <!-- 这里填app_id -->
        <meta-data
        android:name="app_id"
        android:value="${app_id}" />
        <!-- 这里填login_key -->
        <meta-data android:name="client_key" android:value="${login_key}"/>
        <!-- 这里填domain -->
        <meta-data android:name="domain" android:value="${domain}"/>
        <!--   1为横屏 0为竖屏-->
         <meta-data
        android:name="Landscape"
        android:value="0" />
  3. 参数说明

    字段类型说明
    app_idString游戏id
    login_keyString客户端key
    pay_keyString支付key
    domainString服务器地址

三、开始集成

  1. 继承BstApp(必接)

    public class App extends BstApp {
    @Override
    public void onCreate() {
        super.onCreate();
        ...
    }
    }

    如无法直接继承BstApp,可在自己的Application中调用bstsdk的相关方法:

    @Override
    public void onCreate() {
    super.onCreate();
    BstSDKManager.getInstance().onAppCreate(this);
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    BstSDKManager.getInstance().onConfigurationChanged(this, newConfig);
    }
    
    @Override
    public void onTerminate() {
    super.onTerminate();
    BstSDKManager.getInstance().onTerminate(this);
    }
    
    @Override
    protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    BstSDKManager.getInstance().attachBaseContext(this, base);
    }
    
    @Override
    public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    BstSDKManager.getInstance().onTrimMemory(this, level);
    }
    
    @Override
    public void onLowMemory() {
    super.onLowMemory();
    BstSDKManager.getInstance().onLowMemory(this);
    }
  2. 实现生命周期方法(必接)

    需要在主Activity的各个生命周期方法中调用bstsdk对应的方法

  3. 初始化(必接)

    初始化SDK需要传入GCallback接口,SDK的所有回调接口都在里面

    如果初始化没有任何回调,请检查是否有继承BstApp,或者在Application中调用相关的方法

    BstSDKManager.getInstance().init(this, new GCallback() {
    
    初始化成功  请务必在初始化成功后再调用登录
    @Override
    public void sdk_init_success() {
    Log.i("GCallback", "初始化成功");
    }
    
    初始化失败
    @Override
    public void sdk_init_fail() {
    Log.i("GCallback", "初始化失败");
    }
    
    登录成功回调
    @Override
    public void sdk_login_success(String user_id) {
    Toast.makeText(MainActivity.this, "登录成功"+user_id, Toast.LENGTH_SHORT).show();
    uid=user_id;
    }
    
    登录失败回调
    @Override
    public void sdk_login_fail(int code, String reason) {
    Toast.makeText(MainActivity.this, reason, Toast.LENGTH_SHORT).show();
    }
    
    选择实现,玩家是否充值以服务端通知为准
    @Override
    public void sdk_recharge_success(String json) {
    Toast.makeText(MainActivity.this, "支付成功,请以服务端通知为准"+json, Toast.LENGTH_SHORT).show();
    }
    
    退出游戏
    @Override
    public void sdk_logout() {
    Toast.makeText(MainActivity.this, "退出", Toast.LENGTH_SHORT).show();
    }
    
    支付失败回调
    @Override
    public void sdk_recharge_fail(int code, String reason) {
    
    }
    
    无需实现
    @Override
    public void show_sdk_webview() {
    
    }
    
    无需实现
    @Override
    public void show_sdk_webview_width(int radio) {
    
    }
    
    无需实现
    @Override
    public void js_create_order_success_callback(String json) {
    
    }
    
    支付界面被关闭时
    @Override
    public void close_sdk_rechargewindow() {
    
    }
    
    无需实现
    @Override
    public void hide_sdk_loginwindow() {
    
    }
    
    无需实现
    @Override
    public void show_float_view(String isShow) {
    
    }
    
    不同意协议 退出APP 无需实现
    @Override
    public void exit_app() {
    
    }
    
    切换账号 必须实现
    @Override
    public void relogin() {
    /*调用sdk切换账号*/
    BstSDKManager.getInstance().SdkChangeAccount();
    /*你方的代码*/
    }
    
    });
  4. 登录(必接)

    BstSDKManager.getInstance().SdkShowLogin();
  5. 登出(必接)

    BstSDKManager.getInstance().SdkLogout();
  6. 切换账号(必接)

    BstSDKManager.getInstance().SdkChangeAccount();
  7. 上报(必接)

    GameRoleData roleData = new GameRoleData();
    {          
      roleData.setServerId("1"); //区服ID 必须
      roleData.setServerName("1区"); //区服名称 必须
      roleData.setRoleId("10000");  //角色ID 必须
      roleData.setRoleName("孙悟空"); //角色名称 必须
      roleData.setRoleLevel("58");//角色等级 必须 
      roleData.setRoleBalance("8899"); //角色游戏内货币余额
      roleData.setPartyRoleId("1008");  //帮派ID
      roleData.setRolePower("100000");  //角色战力
      roleData.setVipLevel("8");  //VIP等级
      roleData.setRoleGender("男");     //角色性别
      roleData.setPartyName("天下第一帮"); //帮派名称
      roleData.setProfessionId("1");   //角色职业Id
      roleData.setProfession("法师");   //角色职业名称
      roleData.setFriendList("[]");  //角色好友列表
      //事件类型请传入GameRoleData.Event类下的几个参数,不要传入                  
      //其他的
      //unknown 其他、未知;
      //online 进入游戏;
      //create 创建角色;
      //upleve 升级
      //offline 退出游戏
      roleData.setEventName(GameRoleData.Event.create);  //事件类型
      BstSDKManager.getInstance().SdkUploadGameRoleInfo(roleData);
    }
  8. 支付(必接)

    GameRoleData roleData = new GameRoleData();
    roleData.setServerId("1"); //区服ID 必须
    roleData.setServerName("1区"); //区服名称 必须
    roleData.setRoleId("10000");  //角色ID 必须
    roleData.setRoleName("孙悟空"); //角色名称 必须
    roleData.setRoleLevel("58");//角色等级 必须 
    roleData.setRoleBalance("8899"); //角色游戏内货币余额
    roleData.setPartyRoleId("1008");  //帮派ID
    roleData.setRolePower("100000");  //角色战力
    roleData.setVipLevel("8");  //VIP等级
    roleData.setRoleGender("男");     //角色性别
    roleData.setPartyName("天下第一帮"); //帮派名称
    roleData.setProfessionId("1");   //角色职业Id
    roleData.setProfession("法师");   //角色职业名称
    roleData.setFriendList("[]");  //角色好友列表
    //事件类型请传入GameRoleData.Event类下的几个参数,不要传入其他的
    //unknown 其他、未知;online 进入游戏;create 创建角色;upleve 升级offline 退出游戏
    roleData.setEventName(GameRoleData.Event.create);  //事件类型
    OrderInfo orderInfo = new OrderInfo();
    orderInfo.setCpOrderID("ABC" + System.currentTimeMillis()); //cp的订单编号
    orderInfo.setAmount(100);  //订单金额
    orderInfo.setCount(100);     //游戏币数量 即20元可以购买多少游戏币
    orderInfo.setGoodsID("商品ID");  //游戏方商品Id
    orderInfo.setGoodsName("点券"); //商品名称  如:元宝 钻石 点券等
    orderInfo.setGoodsDesc("月卡");//商品描述: 如:周卡 月卡 元旦活动 648送10%
    orderInfo.setExtrasParams("[]");
    //本例是demo,所以把pay_key写在客户端,并进行签名.正确做法:在服务端生成时间戳(timestamp),在服务端计算签名(sign),timestamp和sign随cp订单号一同返回过来
    String timestamp = String.valueOf(System.currentTimeMillis());
    String pay_key="";              
    String signstr = "amount=%1$d&app_id=%2$s&cporder=%3$s&timestamp=%4$s&uid=%5$s%6$s";
    //元需要转换为分
    signstr = String.format(signstr, ((int)( orderInfo.getAmount() * 100)), "appid", orderInfo.getCpOrderID(), uid, timestamp, pay_key);
    BstLog.i("signstr",signstr);
    String sign = BaseTools.md5(signstr);
    
    BstSDKManager.getInstance().SdkShowRecharge(roleData, orderInfo,timestamp,sign);
    orderInfo.setExtrasParams("[]");
    
    //本例是demo,所以把pay_key写在客户端,并进行签名.正确做法:在服务端生成时间戳(timestamp),在服务端计算签名(sign),
    //timestamp和sign随cp订单号一同返回过来
    String timestamp = String.valueOf(System.currentTimeMillis());
    String pay_key="224e594bc55d4879b080238a8db9bcf9";
    
    String signstr = "amount={amount}&app_id={app_id}&cporder={cporder}&timestamp={timestamp}&uid={uid}" + pay_key;
    signstr = signstr.replace("{amount}",((int)( orderInfo.getAmount() * 100))+""); //需要转换为分进行签名
    signstr = signstr.replace("{app_id}", BstConfig.APP_ID);
    signstr = signstr.replace("{cporder}", orderInfo.getCpOrderID());
    signstr = signstr.replace("{uid}", uid);
    signstr = signstr.replace("{timestamp}", timestamp);
    Log.i("signstr",signstr);
    String sign = BaseTools.md5(signstr);
    
    BstSDKManager.getInstance().SdkShowRecharge(roleData, orderInfo,timestamp,sign);
  9. 退出游戏(必接)

    在需要退出游戏的时候调用,弹出退出框

    BstSDKManager.getInstance().onBackPressed();
  10. 其他

    BstSDKManager.getInstance().showFloat(true/false);//展示/关闭悬浮图标
    BstLog.enable();//开启日志

四、注意事项

  1. 注意事项

    所有的方法请在主线程(UI线程)中调用