安卓游戏对接文档

一、版本记录

  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修复接入下游渠道登录校验失败后弹框异常的问题
    v4.5.7修复登录框会影响游戏界面宽高尺寸的问题
    v4.5.8优化数据回传功能
    v4.5.9修复异常bug
    v4.6.0修复异常bug
    v4.6.1
    修复异常bug
    v4.6.2
    修复异常bug
    v4.6.3
    修复异常bug
    v4.6.4
    修复异常bug
    v4.6.5
    修复异常bug
    v4.6.6
    修复异常bug
    v4.6.7
    修复发行角色上传异常


二、环境配置

  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();
        ...
    }
    }
  2. 实现生命周期方法(必接)

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

                Override
                protected void onStart() {
                    super.onStart();
                    BstSDKManager.getInstance().onStart();
                }
            
                @Override
                protected void onResume() {
                    super.onResume();
                    BstSDKManager.getInstance().onResume();
                }
            
                @Override
                protected void onPause() {
                    super.onPause();
                    BstSDKManager.getInstance().onPause();
                }
            
                @Override
                protected void onStop() {
                    super.onStop();
                    BstSDKManager.getInstance().onStop();
                }
            
                @Override
                protected void onRestart() {
                    super.onRestart();
                    BstSDKManager.getInstance().onRestart();
                }
            
                @Override
                protected void onDestroy() {
                    super.onDestroy();
                    BstSDKManager.getInstance().onDestroy();
                }
            
                @Override
                protected void onNewIntent(Intent intent) {
                    super.onNewIntent(intent);
                    BstSDKManager.getInstance().onNewIntent(intent);
                }
            
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    super.onConfigurationChanged(newConfig);
                    BstSDKManager.getInstance().onActivityConfigurationChanged(newConfig);
                }
            
                @Override
                public void onWindowFocusChanged(boolean hasFocus) {
                    super.onWindowFocusChanged(hasFocus);
                    BstSDKManager.getInstance().onWindowFocusChanged(hasFocus);
                }
            
            
                @Override
                public void onRequestPermissionsResult(int requestCode, String[]
                        permissions, int[] grantResults) {
                    super.onRequestPermissionsResult(requestCode, permissions,
                            grantResults);
                    BstSDKManager.getInstance().onRequestPermissionsResult(
                            requestCode, permissions, grantResults);
                }
            
                @Override
                protected void onActivityResult(int requestCode, int resultCode,
                                                Intent data) {
                    super.onActivityResult(requestCode, resultCode, data);
                    BstSDKManager.getInstance().onActivityResult(requestCode,
                            resultCode, data);
                }
  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线程)中调用