米洛SDK Android SDK 对接文档
本文档用于Android SDK对接米洛SDK平台,包含完整的接入流程、接口说明和注意事项。
2026年5月 | WANCMS开发组
接入前项目检查(必接)
根据游戏接入后出现的问题,WancmsSDK对游戏项目做以下几点要求:
1. 设置屏幕适配
在清单文件AndroidManifest.xml的<manifest>内设置适应所有分辨率:
<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节点下添加:
<application android:usesCleartextTraffic="true">
接入流程
添加资源(必接)
下载资源文件,将资源文件中的libs和res文件夹拷贝到项目目录中对应的文件夹。
添加权限(必接)
在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内添加以下参数:
<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:
public class MyApplication extends WSdkApplication{
@Override
public void onCreate() {
super.onCreate();
}
}
将Application添加到AndroidManifest.xml中(必接)
在AndroidManifest.xml中的Application节点,修改android:name属性,其值为游戏新建的Application的全路径:
<application android:name="com.wancms.sdk.MyApplication">
生命周期处理(必接)
在Activity中处理SDK的生命周期回调:
@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)
功能:设置初始化结果回调,一般在游戏开始前,初始化成功后进行游戏登录等相关功能。
WsdkManger.getInstance(this).setInitLinstener(new WsdkManger.InitLinstener() {
@Override
public void onSuccess() {
// 初始化成功
}
@Override
public void onFailed() {
// 初始化失败
}
});
设置登录回调(必接)
方法:public void setLoginLinstener(LoginLinstener loginLinstener)
功能:设置用户登录结果回调的相关处理。
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)
功能:设置用户退出登录结果回调的相关处理。
WsdkManger.getInstance(this).setLoginOutLinstener(new WsdkManger.LoginOutLinstener() {
@Override
public void onSuccess() {
// 注销成功
}
@Override
public void onFailed() {
// 注销失败
}
});
接入要求
在获取到退出成功回调,游戏应回到登录界面并重新调用登录方法。
设置切换账号回调(必接)
方法:public void setSwitchUserLinstener(SwitchUserLinstener switchUserLinstener)
功能:设置用户切换账号回调的相关处理,此回调为切换成功后的回调。游戏应清除当前的游戏角色信息。在切换账号成功后回到选择服务器界面,用回调结果里新的UserInfo进入游戏。此回调内不需要调用登录接口。
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)
功能:设置用户支付结果回调的相关处理。
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)
功能:设置用户退出游戏的相关处理。
WsdkManger.getInstance(this).setExitListener(new WsdkManger.ExitLinstener() {
@Override
public void onSuccess() {
// 在此执行游戏自身的退出逻辑
}
@Override
public void onFailed() {
// 退出失败
}
});
渠道SDK接口调用
接入要求
SDK的接口需要在UI主线程下调用
初始化(必接)
方法:public void init(Activity activity)
功能:渠道SDK初始化
WsdkManger.getInstance(this).init(this);
接入要求
初始化接口需要在activity的onCreate方法中调用,需要先设置好初始化回调。
登录账号(必接)
方法:public void login(Activity activity)
功能:调用渠道SDK登录
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 |
加密字段(在服务端生成) | 必填 |
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 |
加密信息(需要在服务端生成) | 必填 |
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注销账号
WsdkManger.getInstance(this).LoginOut(this);
退出游戏
方法:public void showExitDialod(Activity activity)
功能:确认是否退出,没有弹框返回-1,研发调用自己的弹框。有弹框的时候调用退出接口的ExitLinstener.onSuccess(),通常写在activity的onBackPressed方法中。
@Override
public void onBackPressed() {
WsdkManger.getInstance(this).showExitDialod(this);
}
混淆
本SDK已经经过了混淆,如果项目需要混淆,请将本sdk排除在外。
-keep class com.sum.wmiluo.**{*;}
-keep class com.wan.sdk.**{*;}