米洛SDK Android SDK 对接文档

本文档用于Android SDK对接米洛SDK平台,包含完整的接入流程、接口说明和注意事项。

2026年5月 | WANCMS开发组

接入前项目检查(必接)

根据游戏接入后出现的问题,WancmsSDK对游戏项目做以下几点要求:

1. 设置屏幕适配

在清单文件AndroidManifest.xml的<manifest>内设置适应所有分辨率:

AndroidManifest.xml
<supports-screens
    android:anyDensity="true"
    android:largeScreens="true"
    android:normalScreens="true"
    android:resizeable="true"
    android:smallScreens="true" />

2. 允许HTTP请求

部分渠道targetVersion为28时9.0设备http请求失败,需要在清单文件AndroidManifest.xml中application节点下添加:

AndroidManifest.xml
<application android:usesCleartextTraffic="true">

接入流程

添加资源(必接)

下载资源文件,将资源文件中的libs和res文件夹拷贝到项目目录中对应的文件夹。

添加权限(必接)

在AndroidManifest.xml中添加权限:

AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

配置清单文件参数

在AndroidManifest.xml的Application内添加以下参数:

AndroidManifest.xml
<meta-data android:name="mlsdk_gameId" android:value="2" />
<meta-data android:name="mlsdk_ChannelName" android:value="cps001" />
<meta-data android:name="WAN_DEBUG" android:value="1" />

添加WSdkApplication

新建游戏的Application(必接)

新建游戏的Application,继承WSdkApplication:

Java
public class MyApplication extends WSdkApplication{
    @Override
    public void onCreate() {
        super.onCreate();
    }
}

将Application添加到AndroidManifest.xml中(必接)

在AndroidManifest.xml中的Application节点,修改android:name属性,其值为游戏新建的Application的全路径:

AndroidManifest.xml
<application android:name="com.wancms.sdk.MyApplication">

生命周期处理(必接)

在Activity中处理SDK的生命周期回调:

Java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    com.sum.wmiluo.WsdkManger.getInstance(this).onCreate(this);
}

@Override
protected void onStart() {
    super.onStart();
    com.sum.wmiluo.WsdkManger.getInstance(this).onStart(this);
}

@Override
protected void onRestart() {
    super.onRestart();
    com.sum.wmiluo.WsdkManger.getInstance(this).onRestart(this);
}

@Override
protected void onPause() {
    super.onPause();
    com.sum.wmiluo.WsdkManger.getInstance(this).onPause(this);
}

@Override
protected void onResume() {
    super.onResume();
    com.sum.wmiluo.WsdkManger.getInstance(this).onResume(this);
}

@Override
protected void onStop() {
    super.onStop();
    com.sum.wmiluo.WsdkManger.getInstance(this).onStop(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    com.sum.wmiluo.WsdkManger.getInstance(this).onDestroy(this);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    com.sum.wmiluo.WsdkManger.getInstance(this).onNewIntent(intent);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    com.sum.wmiluo.WsdkManger.getInstance(this).onActivityResult(requestCode, resultCode, data);
}

@Override
protected void onConfigurationChanged(Configuration configuration) {
    super.onConfigurationChanged(configuration);
    com.sum.wmiluo.WsdkManger.getInstance(this).onConfigurationChanged(configuration);
}

@Override
protected void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    com.sum.wmiluo.WsdkManger.getInstance(this).onRequestPermissionsResult(requestCode, permissions, grantResults);
}

添加闪屏(必接)

新建游戏闪屏Activity,继承com.sum.wmiluo.WanSplashActivity

将闪屏Activity添加到AndroidManifest.xml,并将这个Activity设置为启动Activity。

继承后在onSplashStop()进行跳转游戏activity的操作。

SDK回调设置

设置初始化回调(必接)

方法:public void setInitLinstener(InitLinstener initLinstener)

功能:设置初始化结果回调,一般在游戏开始前,初始化成功后进行游戏登录等相关功能。

Java
WsdkManger.getInstance(this).setInitLinstener(new WsdkManger.InitLinstener() {
    @Override
    public void onSuccess() {
        // 初始化成功
    }

    @Override
    public void onFailed() {
        // 初始化失败
    }
});

设置登录回调(必接)

方法:public void setLoginLinstener(LoginLinstener loginLinstener)

功能:设置用户登录结果回调的相关处理。

Java
WsdkManger.getInstance(this).setLoginLinstener(new WsdkManger.LoginLinstener() {
    @Override
    public void onSuccess(UserInfo userInfo) {
        // 登录成功
    }

    @Override
    public void onFailed(String message) {
        // 登录失败
    }
});

登录信息 UserInfo

字段 类型 说明
username String 用户登录名,SDK返回的唯一ID
login_time String 用户登录时间
token String 用户验证token
age String 年龄

接入要求

启动游戏,在登录界面获取到登录成功回调后,进入游戏界面。

设置注销回调(必接)

方法:public void setLoginOutLinstener(LoginOutLinstener loginOutLinstener)

功能:设置用户退出登录结果回调的相关处理。

Java
WsdkManger.getInstance(this).setLoginOutLinstener(new WsdkManger.LoginOutLinstener() {
    @Override
    public void onSuccess() {
        // 注销成功
    }

    @Override
    public void onFailed() {
        // 注销失败
    }
});

接入要求

在获取到退出成功回调,游戏应回到登录界面并重新调用登录方法。

设置切换账号回调(必接)

方法:public void setSwitchUserLinstener(SwitchUserLinstener switchUserLinstener)

功能:设置用户切换账号回调的相关处理,此回调为切换成功后的回调。游戏应清除当前的游戏角色信息。在切换账号成功后回到选择服务器界面,用回调结果里新的UserInfo进入游戏。此回调内不需要调用登录接口。

Java
WsdkManger.getInstance(this).setSwitchUserLinstener(new WsdkManger.SwitchUserLinstener() {
    @Override
    public void onSuccess(UserInfo userInfo) {
        // 切换账号成功
    }

    @Override
    public void onFailed(String message) {
        // 切换账号失败
    }
});

接入要求

在游戏中获取到切换账号成功的通知时,注销当前游戏角色,使用新的用户信息回到游戏界面重新选择区服角色(针对一些渠道SDK在游戏中通过悬浮窗进行账号切换)。

设置支付回调(必接)

方法:public void setPayLinstener(PayLinstener payLinstener)

功能:设置用户支付结果回调的相关处理。

Java
WsdkManger.getInstance(this).setPayLinstener(new WsdkManger.PayLinstener() {
    @Override
    public void onSuccess(String cpOrderId) {
        // cpOrderId:游戏订单号
    }

    @Override
    public void onCancel(String cpOrderId) {
        // 取消支付
    }

    @Override
    public void onFailed(String cpOrderId) {
        // 支付失败
    }
});

注意

游戏充值是否到账,只能以服务器通知为准,部分渠道客户端不会发送正确通知。

设置退出回调(必接)

方法:public void setExitListener(ExitLinstener exitLinstener)

功能:设置用户退出游戏的相关处理。

Java
WsdkManger.getInstance(this).setExitListener(new WsdkManger.ExitLinstener() {
    @Override
    public void onSuccess() {
        // 在此执行游戏自身的退出逻辑
    }

    @Override
    public void onFailed() {
        // 退出失败
    }
});

渠道SDK接口调用

接入要求

SDK的接口需要在UI主线程下调用

初始化(必接)

方法:public void init(Activity activity)

功能:渠道SDK初始化

Java
WsdkManger.getInstance(this).init(this);

接入要求

初始化接口需要在activity的onCreate方法中调用,需要先设置好初始化回调。

登录账号(必接)

方法:public void login(Activity activity)

功能:调用渠道SDK登录

Java
WsdkManger.getInstance(this).login(this);

接入要求

进入到登录界面后,自动调用此接口。调用登录接口前需要保证初始化成功后再调用。

上传角色信息(必接)

方法:public void setRoleInfo(RoleInfo roleInfo)

功能:调用渠道SDK上传角色信息

RoleInfo类说明

字段名 类型 说明 是否必填
ServerId String 服务器id 必填
ServerName String 服务器名称 必填
RoleName String 角色名 必填
RoleId String 角色id 必填
RoleLevel String 角色等级 必填
roleCreateTime String 角色创建时间 选填
profession String 角色职业名称 选填
professionId String 角色职业id 选填
gameRoleGender String 角色性别 选填
gameRolePower String 角色战力 选填
VipLevel String 角色VIP等级 选填
gameRoleBalance String 角色用户余额 选填
partyName String 帮派名称 选填
partyId String 帮派id 选填
partyRoleName String 角色在帮派中的名称 选填
partyRoleId String 角色在帮派中的id 选填
friendlist String 好友关系列表 选填
sign String 加密字段(在服务端生成) 必填
Java
RoleInfo roleInfo = new RoleInfo();
roleInfo.setServerId("1");
roleInfo.setServerName("浙江一区");
roleInfo.setRoleName("阿毛");
roleInfo.setRoleId("11111");
roleInfo.setRoleLevel("100");
roleInfo.setRoleCreateTime("2022-12-12");
roleInfo.setProfession("鬼剑士");
roleInfo.setProfessionId("11");
roleInfo.setGameRoleGender("男");
roleInfo.setGameRolePower("99999");
roleInfo.setVipLevel("vip10");
roleInfo.setGameRoleBalance("10000000");
roleInfo.setPartyName("天地会");
roleInfo.setPartyId("120");
roleInfo.setPartyRoleName("坛主");
roleInfo.setPartyRoleId("9");
roleInfo.setFriendlist("无");//有值传入json数组字符串
//sign 需要在服务端生成 此处只为演示 
//下文中的 0cb53fa5eb328b30c5224fdb4803b1b1 为mlsdk_appKey 需替换为对应对接参数中的mlsdk_appKey
roleInfo.setSign(md5(username + "#" + roleInfo.getRoleId() + "#" + roleInfo.getServerId() + "#" + roleInfo.getRoleLevel() + "#" +roleInfo.getGameRolePower()+"#"+ "0cb53fa5eb328b30c5224fdb4803b1b1"));

WsdkManger.getInstance(this).setRoleInfo(roleInfo);

接入要求

  • 创建角色后上报,进入游戏后上报,角色升级时上报
  • 无对应字段传空字符串
  • 如果游戏前期升级速度过快,可以升10级上报一次

sign加密规则

对登录返回的用户名、角色id、服务器id、角色等级、战力、对接参数mlsdk_appKey 进行md5加密:

md5(username + "#" + roleId + "#" + serverId + "#" + roleLevel + "#" + gameRolePower + "#" + mlsdk_appKey)

强烈建议:sign 需要在服务端生成,此处只为演示

定额支付(必接)

方法:public void pay(Activity activity, PayInfor payInfor)

功能:调用渠道SDK支付

PayInfor类说明

字段名 类型 说明 是否必填
amount String 总金额 (保留两位小数) 必填
ServerId String 区服名 必填
RoleId String 角色id 必填
goodsID String 产品id 选填
goodsName String 产品名称 必填
cpOrderID String 游戏方的订单号 必填
count int 游戏币数量 必填,没有默认填1
goodsdesc String 产品描述 必填
extrasParams String 透传参数 必填
ServerName String 区服名 必填
RoleName String 角色名 必填
UserLevel String 角色等级 选填
VipLevel String 角色VIP等级 选填
gameRoleBalance String 角色余额 选填
partyName String 帮派名称 选填
sign String 加密信息(需要在服务端生成) 必填
Java
PayInfor payInfor = new PayInfor();
payInfor.setAmount(1);
payInfor.setServerId("1");
payInfor.setRoleId("11111");
payInfor.setGoodsID("666");
payInfor.setGoodsName("钻石");
payInfor.setCpOrderID("cp1111111");
payInfor.setCount(6666);
payInfor.setGoodsdesc("游戏内的一个商品");
payInfor.setExtrasParams("额外参数");
payInfor.setServerName("浙江一区");
payInfor.setRoleName("阿毛");
payInfor.setUserLevel("100");
payInfor.setVipLevel("vip10");
payInfor.setGameRoleBalance("10000000");
payInfor.setPartyName("天地会");
//sign 需要在服务端生成 此处只为演示 mlsdk_appKey为APPKEY
payInfor.setSign(md5(username+"#"+roleid+"#"+cporderid+"#"+amount+"#"+mlsdk_appKey));

WsdkManger.getInstance(this).pay(this, payInfor);

接入要求

如果游戏没有以上字段,传空字符串

退出账号(必接)

方法:public void LoginOut(Activity activity)

功能:渠道SDK注销账号

Java
WsdkManger.getInstance(this).LoginOut(this);

退出游戏

方法:public void showExitDialod(Activity activity)

功能:确认是否退出,没有弹框返回-1,研发调用自己的弹框。有弹框的时候调用退出接口的ExitLinstener.onSuccess(),通常写在activity的onBackPressed方法中。

Java
@Override
public void onBackPressed() {
    WsdkManger.getInstance(this).showExitDialod(this);
}

混淆

本SDK已经经过了混淆,如果项目需要混淆,请将本sdk排除在外。

proguard-rules.pro
-keep class com.sum.wmiluo.**{*;}
-keep class com.wan.sdk.**{*;}