乐玩SDK接入文档(买量)
<p>[TOC]</p>
<h1>乐玩SDK接入文档</h1>
<h2>1、开发环境搭建</h2>
<h3>1.1、将 SDK aar 文件复制到游戏工程的 libs 目录中并引用</h3>
<h3>1.2、复制 assets 目录下的 lwsdk.xml 文件到游戏工程的 assets 目录</h3>
<ul>
<li>
<p>将assets中的 <code>lwsdk.xml</code> 配置文件中的参数进行修改
game //乐玩游戏标识
api_secret //lewan SDK和普通API秘钥</p>
</li>
<li>将 WXEntryActivity 文件复制到工程包名路径 + wxapi 下</li>
</ul>
<h3>1.3、第三方依赖</h3>
<ul>
<li>app\build.gradle</li>
</ul>
<pre><code class="language-java">dependencies {
implementation fileTree(include: [&#039;*.jar&#039;,&#039;*.aar&#039;], dir: &#039;libs&#039;)
implementation &#039;com.squareup.okhttp3:okhttp:3.11.0&#039;
implementation &#039;androidx.appcompat:appcompat:1.2.0&#039;
implementation &#039;org.jetbrains:annotations:15.0&#039;
implementation &#039;com.pangle.cn:mediation-sdk:6.1.0.4&#039;
// 巨量广告
implementation &#039;com.bytedance.applog:RangersAppLog-Lite-cn:6.16.3&#039;
implementation &#039;com.bytedance.ads:AppConvert:1.3.1.0&#039;
implementation &#039;com.pangle.cn:mediation-sdk:6.1.0.4&#039; //穿山甲融合SDK
// bugly崩溃日志
implementation &#039;com.tencent.bugly:crashreport:latest.release&#039;
implementation &#039;com.tencent.mm.opensdk:wechat-sdk-android:+&#039;
api &#039;com.tencent.vasdolly:helper:3.0.4&#039;
}</code></pre>
<ul>
<li>settings.gradle</li>
</ul>
<pre><code class="language-java">repositories {
google()
mavenCentral()
maven {
url &#039;https://artifact.bytedance.com/repository/Volcengine/&#039;
}
maven { url &#039;https://jitpack.io&#039; }
maven {
url &quot;https://artifact.bytedance.com/repository/pangle&quot; //穿山甲融合SDK依赖
}
}</code></pre>
<ul>
<li>AndroidMainfest.xml</li>
</ul>
<pre><code class="language-xml">&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
&lt;uses-sdk tools:overrideLibrary=&quot;android.support.v7.appcompat,android.support.v7.recyclerview,com.dingmouren.layoutmanagergroup,com.zyyoona7.lib,com.squareup.leakcanary, com.squareup.leakcanary.analyzer, com.squareup.leakcanary.android.noop,com.mopub.mobileads.base,com.mopub.mobileads.rewarded_video, com.mopub.mobileads.banner,com.mopub.mobileads.interstitial,com.moat.analytics.mobile.mpub,com.google.android.ads.mediationtestsuite,com.bytedance.crash,com.bytedance.metasec&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.READ_PHONE_STATE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.REQUEST_INSTALL_PACKAGES&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_COARSE_LOCATION&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.VIBRATE&quot; /&gt;
&lt;application
android:allowBackup=&quot;true&quot; //游戏根据自己设置
tools:replace=&quot;android:allowBackup&quot; //需要加这一句
/&gt;
&lt;activity
android:name=&quot;com.llewansdk.sdk.lianyun.user.SdkPageView&quot;
android:configChanges=&quot;keyboard|keyboardHidden|screenLayout|screenSize|orientation&quot;
android:theme=&quot;@android:style/Theme.Translucent.NoTitleBar.Fullscreen&quot;
android:windowSoftInputMode=&quot;adjustResize&quot; /&gt;
&lt;activity
android:name=&quot;.wxapi.WXEntryActivity&quot; //需把该微信登录activity放在包名路径后,如包名 com.abc ,则该路径是 com.abc.wxapi.WXEntryActivity
android:theme=&quot;@android:style/Theme.Translucent.NoTitleBar&quot;
android:exported=&quot;true&quot;
android:taskAffinity=&quot;${applicationId}&quot;
android:launchMode=&quot;singleTask&quot;&gt;
&lt;/activity&gt;
&lt;meta-data
android:name=&quot;gdt_appid&quot;
android:value=&quot;&quot; /&gt;
&lt;!-- 广点通 appid --&gt;
&lt;meta-data
android:name=&quot;gdt_appkey&quot;
android:value=&quot;&quot; /&gt;
&lt;!-- 广点通 appkey --&gt;
&lt;meta-data
android:name=&quot;lw_channel&quot;
android:value=&quot;mp&quot; /&gt;
&lt;!-- 广点通填 mp ,头条填 toutiao --&gt;
&lt;meta-data
android:name=&quot;lw_game&quot;
android:value=&quot;&quot; /&gt;
&lt;!-- lw_game | 乐玩提供的game标识 --&gt;
&lt;meta-data
android:name=&quot;lw_apiSecret&quot;
android:value=&quot;&quot; /&gt;
&lt;!-- lw_apiSecret | 乐玩提供的api_secret --&gt;
&lt;meta-data
android:name=&quot;lw_game_env&quot;
android:value=&quot;pro&quot; /&gt;
&lt;!-- lw_game_env | 测试环境请填:test,正式环境:pro --&gt;
&lt;meta-data
android:name=&quot;lw_debug&quot;
android:value=&quot;1&quot; /&gt;
&lt;meta-data
android:name=&quot;csj_app_id&quot;
android:value=&quot;5569898&quot; /&gt;
&lt;!-- csj_app_id | 对应平台应用appid --&gt;
&lt;meta-data
android:name=&quot;tt_ad_appid&quot;
android:value=&quot;613008&quot; /&gt;
&lt;meta-data
android:name=&quot;sourceId&quot;
android:value=&quot;[LW_SOURCE_ID]&quot; /&gt;
&lt;meta-data
android:name=&quot;BUGLY_APPID&quot;
android:value=&quot;2625868706&quot; /&gt;
&lt;!-- BUGLY_APPID 运营提供 --&gt;
&lt;!-- 配置APP版本号 --&gt;
&lt;meta-data
android:name=&quot;BUGLY_APP_VERSION&quot;
android:value=&quot;1.3.16&quot; /&gt;
&lt;!-- 配置APP渠道号 --&gt;
&lt;meta-data
android:name=&quot;BUGLY_APP_CHANNEL&quot;
android:value=&quot;lewan&quot; /&gt;
&lt;!-- 配置Bugly调试模式(true或者false)--&gt;
&lt;meta-data
android:name=&quot;BUGLY_ENABLE_DEBUG&quot;
android:value=&quot;false&quot; /&gt;
&lt;activity
android:name=&quot;com.llewansdk.sdk.lianyun.pay.SdkPayActivity&quot;
android:allowTaskReparenting=&quot;true&quot;
android:configChanges=&quot;keyboardHidden|orientation|screenSize&quot;
android:exported=&quot;true&quot;
android:hardwareAccelerated=&quot;true&quot;
android:screenOrientation=&quot;portrait&quot;
tools:ignore=&quot;DuplicateActivity,LockedOrientationActivity&quot; /&gt;
&lt;provider
android:name=&quot;com.bytedance.sdk.openadsdk.TTFileProvider&quot;
android:authorities=&quot;${applicationId}.TTFileProvider&quot;
android:exported=&quot;false&quot;
android:grantUriPermissions=&quot;true&quot;&gt;
&lt;meta-data
android:name=&quot;android.support.FILE_PROVIDER_PATHS&quot;
android:resource=&quot;@xml/pangle_file_paths&quot; /&gt;
&lt;/provider&gt;
&lt;provider
android:name=&quot;com.bytedance.sdk.openadsdk.multipro.TTMultiProvider&quot;
android:authorities=&quot;${applicationId}.TTMultiProvider&quot;
android:exported=&quot;false&quot; /&gt;</code></pre>
<h2>2、功能接口 (注意:以下所有接口都必须在游戏收到 SDK 初始化完成之后才能调用,所有接口请在主线程调用,SDK的回调不一定是主线程)</h2>
<h3>2.1、继承 LWSdkApplication (必接)</h3>
<p>游戏工程如果没有Application,请在 AndroidManifest.xml 中添加SDK的Application,如下所示:</p>
<pre><code class="language-xml">&lt;application android:name=&quot;com.lewan.application.LWSdkApplication&quot;&gt;</code></pre>
<p>游戏工程如果有自定义 Application,请继承 SDK 中 LWSdkApplication:</p>
<pre><code class="language-java">public class XXXXApplication extends LWSdkApplication {
@Override
public void onCreate() {
super.onCreate();
}
}</code></pre>
<h3>2.2、初始化接口(必接)</h3>
<pre><code> 注意: 初始化接口必须在调用申请权限回调以后再调用
接口说明:
首先在程序开始的地方调用 SDK 的初始化 init 方法,并设置 Activity 对像和初始化完成回调监听
(在初始化失败情况下不再调用其它 SDK 接口方法)
注意:要确保在 SDK 初始化成功后才可调用其它接口</code></pre>
<h4>2.2.1、方法定义</h4>
<pre><code class="language-java">public void init(Activity context, LWSdkCallback lwsdkCallback)</code></pre>
<h4>2.2.2、参数说明</h4>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>context</td>
<td>上下文</td>
</tr>
<tr>
<td>lwsdkCallback</td>
<td>回调通知,初始化,登录,充值等回调通知都统一在此</td>
</tr>
<tr>
<td>code</td>
<td>所有 <code>成功</code> 回调的code都为 LWSdkCode.SUCCESS_CODE ,所有 <code>失败</code> 回调的code都为 LWSdkCode.FAIL_CODE</td>
</tr>
</tbody>
</table>
<h4>2.2.3、代码示例:</h4>
<pre><code class="language-java">LWSdk.getInstance().init(this, new LWSdkCallback() {
@Override
public void init(int code, Object object) {
//初始化回调
if (code == LWSdkCode.SUCCESS_CODE){
//初始化成功
} else if (code == LWSdkCode.FAIL_CODE) {
//初始化失败
}
}
@Override
public void login(int code, Object object) {
//登录回调
if (code == LWSdkCode.SUCCESS_CODE){
//登录成功
LWSdkLoginResult loginResult = (LWSdkLoginResult) object;
String uid = loginResult.getUid();
String token = loginResult.getSdk_token();
} else if (code == LWSdkCode.FAIL_CODE) {
//登录失败
}
}
@Override
public void pay(int code, String msg) {
//
回调
if (code == LWSdkCode.SUCCESS_CODE){
//支付成功或者完成的回调,只为了回调给游戏关闭支付页面等功能,发货以服务端通知回调为准
} else if (code == LWSdkCode.FAIL_CODE) {
//支付取消或者失败的回调,只为了回调给游戏关闭支付页面或重新发起支付等功能
}
}
@Override
public void submitRoleInfo(int code, String msg) {
//上报角色信息回调
}
@Override
public void logout(int code, String msg) {
//退出账号回调
if (code == LWSdkCode.SUCCESS_CODE){
//游戏收到账号退出成功回调,退出当前角色到开始界面再重新调用登录接口
} else if (code == LWSdkCode.FAIL_CODE) {
//账号退出取消或者失败的回调
}
}
@Override
public void exitGame(int code, String msg) {
//退出游戏回调
if (code == LWSdkCode.SUCCESS_CODE){
//游戏收到退出游戏的回调,可以进行一些数据保存或者资源的回收销毁再退出
} else if (code == LWSdkCode.FAIL_CODE) {
//退出游戏的取消或者失败,一般可以不做处理
}
}
@Override
public void expansionInterface(int code, String param) {
//扩展接口回调
}
@Override
public void checkChat(int code, String msg) {
//敏感词检测回调
//{&quot;code&quot;:1,&quot;msg&quot;:&quot;success&quot;,&quot;d&quot;:{&quot;suggest&quot;:&quot;risky&quot;,&quot;risky_word&quot;:&quot;:习大&quot;,&quot;label&quot;:90001}}
}
@Override
public void loadAd(int code, Object object) {
//加载广告回调
}
@Override
public void showAd(int code, Object object) {
//显示广告回调
}
@Override
public void checkIdAuth(int code, Object object) {
//检查实名认证回调
//{&quot;authStat&quot;:1} 0表示未实名,1表示已实名且已成年,2表示已实名未成年
}
});
</code></pre>
<h3>2.3、登录接口(必接)</h3>
<p>接口说明:游戏登录时调用</p>
<h4>2.3.1、方法定义</h4>
<pre><code class="language-java">public void login(Activity context, String custom)</code></pre>
<h4>2.3.2、参数说明</h4>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>context</td>
<td>上下文</td>
</tr>
<tr>
<td>custom</td>
<td>游戏自定义参数,可通过回调方法 login 中的参数 LWSdkLoginResult 对象的 getCustom()获取</td>
</tr>
</tbody>
</table>
<h4>2.3.3、代码示例</h4>
<pre><code class="language-java">LWSdk.getInstance().login(this,&quot;&quot;)</code></pre>
<h4>2.3.4、登录回调对象 LWSdkLoginResult 参数说明</h4>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>game</td>
<td>游戏标识</td>
</tr>
<tr>
<td>uid</td>
<td>用户UID</td>
</tr>
<tr>
<td>sdk_token</td>
<td>用户登录态,用于服务端登录校验注意token有效期为5分钟,服务端需要在5分钟内完成校验</td>
</tr>
<tr>
<td>channel</td>
<td>渠道标识</td>
</tr>
<tr>
<td>source_id</td>
<td>乐玩广告标识</td>
</tr>
<tr>
<td>real_name_stat</td>
<td>用户实名状态,0未实名,1实名且成年,2实名未成年</td>
</tr>
</tbody>
</table>
<h3>2.4、提交角色数据接口(必接)</h3>
<p>接口说明:游戏提交角色数据接口,该接口需要在以下4中情况下调用:</p>
<ul>
<li>角色登录成功</li>
<li>角色升级</li>
<li>创建角色</li>
</ul>
<h4>2.4.1、方法定义</h4>
<pre><code class="language-java">public void submitRoleInfo(Activity context, LWSdkRoleInfo roleInfo)</code></pre>
<h4>2.4.2、参数说明</h4>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>context</td>
<td>上下文</td>
</tr>
<tr>
<td>LWSdkRoleInfo</td>
<td>角色实体类对象</td>
</tr>
</tbody>
</table>
<pre><code>LWSdkRoleInfo 实体类字段说明(以下参数都为必传参数,如游戏没有的传 &quot;&quot; 或者 &quot;0&quot;)</code></pre>
<table>
<thead>
<tr>
<th>字段名</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>submitType</td>
<td><code>创建角色</code> 调用类型 Type_CreateRole ,<code>角色进入游戏</code> 调用类型 Type_EnterGame ,<code>角色升级</code> 调用类型 Type_RoleUpgrade</td>
</tr>
<tr>
<td>serverId</td>
<td>服务器ID,长度不超过20字符,建议使用字符串型数值,例如:1</td>
</tr>
<tr>
<td>serverName</td>
<td>服务器名称,长度不超过20字符</td>
</tr>
<tr>
<td>zoneId</td>
<td>大区ID, 如有必填,没有传"",长度不超过100字符</td>
</tr>
<tr>
<td>zoneName</td>
<td>大区名称, 如有必填,没有传"",长度不超过100字符</td>
</tr>
<tr>
<td>isNew</td>
<td>是否当前新创建角色,否为0,是为1</td>
</tr>
<tr>
<td>roleId</td>
<td>角色ID,长度不超过20字符,建议使用字符串型数值,例如:1</td>
</tr>
<tr>
<td>roleName</td>
<td>角色名称,长度不超过100字符,不设定角色名称可传 ""</td>
</tr>
<tr>
<td>roleLevel</td>
<td>角色等级,不设定可传 0</td>
</tr>
<tr>
<td>vipLevel</td>
<td>角色vip等级,不是VIP传0,是VIP传正常值</td>
</tr>
<tr>
<td>gender</td>
<td>角色性别,没有传"0", 有传"1" 或 "2"("1"代表男,"2"代表女)</td>
</tr>
<tr>
<td>power</td>
<td>角色战力值,若没传""</td>
</tr>
<tr>
<td>serverOpenTime</td>
<td>开服时间,有则传时间,具体到秒,格式如:"2022-02-02 10:00:00",若无则传""</td>
</tr>
</tbody>
</table>
<h4>2.4.3、代码示例</h4>
<pre><code class="language-java">LWSdkRoleInfo roleInfo = new LWSdkRoleInfo();
roleInfo.setServerId(&quot;123&quot;);
roleInfo.setServerName(&quot;服务器名字&quot;);
roleInfo.setZoneId(&quot;3&quot;);
roleInfo.setZoneName(&quot;我是区名&quot;);
roleInfo.setRoleId(&quot;66&quot;);
roleInfo.setRoleName(&quot;角色名&quot;);
roleInfo.setRoleLevel(&quot;99&quot;);
roleInfo.setVipLevel(&quot;3&quot;);
roleInfo.setGender(&quot;1&quot;);
roleInfo.setPower(&quot;&quot;);
roleInfo.setServerOpenTime(&quot;2022-02-02 10:00:00&quot;);
roleInfo.setSubmitType(LWSdkRoleInfo.Type_CreateRole);
roleInfo.setIsNew(&quot;1&quot;);
LWSdk.getInstance().submitRoleInfo(this,roleInfo);</code></pre>
<h3>2.5、支付接口(必接)</h3>
<h4>2.5.1、方法定义</h4>
<pre><code class="language-java">public void pay(Activity context, LWSdkPayInfo lwSdkPayInfo)</code></pre>
<h4>2.5.2、参数说明</h4>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>context</td>
<td>上下文</td>
</tr>
<tr>
<td>LWSdkPayInfo</td>
<td>支付实体类对象</td>
</tr>
</tbody>
</table>
<pre><code> 支付信息实体类(LWSdkPayInfo)字段说明</code></pre>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>amount</td>
<td>订单金额,单位:分;例如:600</td>
</tr>
<tr>
<td>propName</td>
<td>道具商品名称,长度不超过50字符。如无传""</td>
</tr>
<tr>
<td>propId</td>
<td>道具商品ID,长度不超过50字符。 如无传""</td>
</tr>
<tr>
<td>serverId</td>
<td>服务器ID,长度不超过20字符,建议使用字符串型数值。</td>
</tr>
<tr>
<td>serverName</td>
<td>服务器名称,长度不超过20字符,建议使用字符串型数值。</td>
</tr>
<tr>
<td>roleId</td>
<td>角色ID,长度不超过64字符,建议使用字符串型数值。</td>
</tr>
<tr>
<td>roleName</td>
<td>角色名称,长度不超过100字符,不设定角色名称可传""</td>
</tr>
<tr>
<td>roleLevel</td>
<td>角色等级,不设定可传 0</td>
</tr>
<tr>
<td>zoneId</td>
<td>大区ID, 如有必填,没有则传"1",长度不超过60字符</td>
</tr>
<tr>
<td>zoneName</td>
<td>大区名称, 如有必填,没有传"",长度不超过60字符</td>
</tr>
<tr>
<td>attach</td>
<td>附带参数,支付成功的回调中会带上该参数。</td>
</tr>
<tr>
<td>cpOrderSn</td>
<td>CP方订单唯一标识,长度不超过64字符,例如:sgbw2020123456789。</td>
</tr>
</tbody>
</table>
<h4>2.5.3、代码示例</h4>
<pre><code class="language-java">LWSdkPayInfo lwSdkPayInfo = new LWSdkPayInfo();
lwSdkPayInfo.setCpOrderSn(&quot;test_&quot;+System.currentTimeMillis());
lwSdkPayInfo.setAmount(600);
lwSdkPayInfo.setPropName(&quot;我是商品名&quot;);
lwSdkPayInfo.setPropId(&quot;product_id_123&quot;);
lwSdkPayInfo.setServerId(&quot;123&quot;);
lwSdkPayInfo.setServerName(&quot;服务器名字&quot;);
lwSdkPayInfo.setRoleId(&quot;66&quot;);
lwSdkPayInfo.setRoleName(&quot;角色名&quot;);
lwSdkPayInfo.setRoleLevel(&quot;99&quot;);
lwSdkPayInfo.setZoneId(&quot;3&quot;);
lwSdkPayInfo.setZoneName(&quot;我是区名&quot;);
lwSdkPayInfo.setAttach(&quot;我是透传参数&quot;);
LWSdk.getInstance().pay(this, lwSdkPayInfo);</code></pre>
<h4>2.5.4、客户端支付回调 msg 说明</h4>
<pre><code> {&quot;code&quot;:0,&quot;msg&quot;:&quot;close&quot;,&quot;order&quot;:{&quot;cpOrderSn&quot;:&quot;xxxxx&quot;,&quot;checkPay&quot;:false}}</code></pre>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>code</td>
<td>0默认响应,-1异常</td>
</tr>
<tr>
<td>msg</td>
<td>提示消息</td>
</tr>
<tr>
<td>order</td>
<td>回调订单信息对象</td>
</tr>
<tr>
<td>order.cpOrderSn</td>
<td>当前回调对应的CP订单号</td>
</tr>
<tr>
<td>order.checkPay</td>
<td>是否应该主动査询订单支付状态(客户端轮询发货方式适用),为 <code>false</code> 时表示用户未正常拉起支付,此时可不进行轮询,为 <code>true</code> 时应轮询订单支付状态</td>
</tr>
</tbody>
</table>
<h3>2.6、账号注销退出登录(必接)</h3>
<h4>2.6.1、判断是否有账号注销退出功能 方法定义</h4>
<pre><code class="language-java">public boolean hasLogout()</code></pre>
<h4>2.6.2、调用账号注销退出登录 方法定义</h4>
<pre><code class="language-java">public void logout(Activity context)</code></pre>
<h4>2.6.3、代码示例</h4>
<pre><code class="language-java"> if (LWSdk.getInstance().hasLogout()) {
LWSdk.getInstance().logout(this);
//回调在 LWSdkCallback logout
}else {
//渠道无注销账号退出登录功能,游戏直接退出当前账号角色返回到初始界面调用SDK的登录接口
}</code></pre>
<h3>2.7、敏感词校验(必接)</h3>
<h4>2.7.1、判断是否有敏感词校验功能 方法定义</h4>
<pre><code class="language-java">public boolean hasCheckChat()</code></pre>
<h4>2.7.2、调用敏感词校验 方法定义</h4>
<pre><code class="language-java">public void checkChat(Activity context, String msg)</code></pre>
<h4>2.7.3、代码示例</h4>
<pre><code class="language-java">if (LWSdk.getInstance().hasCheckChat()) {
LWSdk.getInstance().checkChat(this,&quot;敏感词测试:●●●&quot;);
//回调在 LWSdkCallback checkChat
}else {
//渠道无敏感词校验方法,游戏需自行实现
}</code></pre>
<pre><code> 回调说明</code></pre>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必含</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">int</td>
<td>响应状态,1成功,-1异常</td>
</tr>
<tr>
<td style="text-align: left;">msg </td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>响应结果说明</td>
</tr>
<tr>
<td style="text-align: left;">d </td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">object</td>
<td>校验结果主体</td>
</tr>
<tr>
<td style="text-align: left;">d.suggest </td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>有risky、pass、review三种值。pass表示不包含敏感词,risky包含敏感词</td>
</tr>
<tr>
<td style="text-align: left;">d.label </td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">int</td>
<td>命中标签枚举值,100 正常;10001 广告;20001 时政;20002 色情;20003 辱骂;20006 违法犯罪;20008 欺诈;20012 低俗;20013 版权;21000 其他</td>
</tr>
<tr>
<td style="text-align: left;">d.risky_word </td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>命中敏感词</td>
</tr>
</tbody>
</table>
<h3>2.8、实名认证状态查询(必接) 在登录账号完成之后调用一次</h3>
<h4>2.8.1、方法定义</h4>
<pre><code> 回调结果 {&quot;authStat&quot;:1} 0表示未实名,1表示已实名且已成年,2表示已实名未成年</code></pre>
<pre><code class="language-java">public void checkIdAuth(Activity context)</code></pre>
<h4>2.8.2、代码示例</h4>
<pre><code class="language-java">LWSdk.getInstance().checkIdAuth(this);
//回调在 LWSdkCallback checkIdAuth</code></pre>
<h3>2.9、广告接口(必接)游戏应在登录回调后调用</h3>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>context</td>
<td>上下文</td>
</tr>
<tr>
<td>adKey</td>
<td>广告位key</td>
</tr>
</tbody>
</table>
<h4>2.9.1、广告初始化(必接)</h4>
<pre><code class="language-java">LWSdk.getInstance().initAd();//此接口用于激励视频配置初始化,有网络请求,游戏应在登录完成后看时机尽早调用
LWSdk.getInstance().startAd(this);//在adInit后调用</code></pre>
<h4>2.9.2、加载广告(必接)</h4>
<pre><code> 视频广告预加载,需要在初始化完成后调用。游戏应该在首次出现广告播放按钮的界面调用一次此接口,后续可以在播放完成后调用进行预加载。
注意:首次调用会拉起用户授权,为了合规需要,游戏应该在有广告按钮展示的界面再调用此接口。如果出现广告拉起失败的情况,游戏可以调用一次此接口,但切勿一直重试,一直加载而不展示会影响广告后续填充率。</code></pre>
<pre><code class="language-java">LWSdk.getInstance().loadAd(this);</code></pre>
<p>响应参数说明9.3</p>
<p>响应结果为json字符串,解析后字段如下:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必含</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">int</td>
<td>加载结果,1:加载成功,2:加载失败</td>
</tr>
<tr>
<td style="text-align: left;">msg </td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>加载结果说明</td>
</tr>
<tr>
<td style="text-align: left;">scene</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>场景标识</td>
</tr>
</tbody>
</table>
<h4>2.9.3、显示广告(必接)</h4>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必含</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">buttonKey</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>乐玩广告位ID,由运营同学提供</td>
</tr>
</tbody>
</table>
<pre><code class="language-java">LWSdk.getInstance().showAd(this,&quot;99999&quot;);//调用此接口发起视频展示。</code></pre>
<p>响应结果为json字符串,解析后字段如下:</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必含</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">int</td>
<td>广告播放状态码。1:播放成功,2:播放失败(此时应重试一次广告加载并播放,但切勿一直重试)</td>
</tr>
<tr>
<td style="text-align: left;">canReward </td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">int</td>
<td>是否满足奖励发放条件,1:满足;0:不满足(广告未播放完成或者广告播放异常)</td>
</tr>
</tbody>
</table>
<h3>2.10、退出游戏(必接)</h3>
<p>先判断有无退出游戏dialog,再调用显示退出dialog</p>
<pre><code class="language-java">if (LWSdk.getInstance().hasExitDialog()){
LWSdk.getInstance().showExitDialog(this); //回调在 exitGame
}</code></pre>
<h2>3、生命周期(必接)</h2>
<pre><code class="language-java"> @Override
protected void onStop() {
LWSdk.getInstance().onStop(this);
super.onStop();
}
@Override
protected void onResume() {
LWSdk.getInstance().onResume(this);
super.onResume();
}
@Override
protected void onPause() {
LWSdk.getInstance().onPause(this);
super.onPause();
}
@Override
protected void onStart() {
LWSdk.getInstance().onStart(this);
super.onStart();
}
@Override
protected void onRestart() {
LWSdk.getInstance().onRestart(this);
super.onRestart();
}
@Override
protected void onDestroy() {
LWSdk.getInstance().onDestroy(this);
super.onDestroy();
}
@Override
protected void onNewIntent(Intent intent) {
LWSdk.getInstance().onNewIntent(this,intent);
super.onNewIntent(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
LWSdk.getInstance().onActivityResult(requestCode,resultCode,data);
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
LWSdk.getInstance().onConfigurationChanged(newConfig);
super.onConfigurationChanged(newConfig);
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
LWSdk.getInstance().onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
LWSdk.getInstance().onRestoreInstanceState(savedInstanceState);
super.onRestoreInstanceState(savedInstanceState);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
LWSdk.getInstance().onWindowFocusChanged(hasFocus);
super.onWindowFocusChanged(hasFocus);
}
@Override
public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
LWSdk.getInstance().onWindowAttributesChanged(params);
super.onWindowAttributesChanged(params);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
LWSdk.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}</code></pre>
<h2>4.混淆配置 proguard-rules.pro</h2>
<pre><code class="language-java">#self
-keep class com.llewansdk.** { *; }
-keep class com.lewan.** { *; }
#new
-keep class com.bytedance.** {*;}
-keep class com.qq.** {*;}
-keep class com.google.gson.** {*;}
-keep class org.json.** {*;}
-keep class androidx.** {*;}
-keep class com.android.** {*;}
-keep class com.tencent.** {*;}
#bugly
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
#gdt
-dontwarn com.qq.gdt.action.**
-keep class com.qq.gdt.action.** {*;}
-keep public class com.tencent.turingfd.sdk.**
-keepclasseswithmembers class * {
native &lt;methods&gt;;
}
#weixin
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
#csj 融合
-keep class bykvm*.**
-keep class com.bytedance.msdk.adapter.**{ public *; }
-keep class com.bytedance.msdk.api.** {
public *;
}
#juliang
-keep class com.bytedance.ads.convert.broadcast.common.EncryptionTools {*;}
#oaid sdk
-keep class com.bun.miitmdid.** { *; }
-keep interface com.bun.supplier.** { *; }
-keep class androidx.core.**{*;}
# asus
-keep class com.asus.msa.SupplementaryDID.** { *; }
-keep class com.asus.msa.sdid.** { *; }
# freeme
-keep class com.android.creator.** { *; }
-keep class com.android.msasdk.** { *; }
# huawei -keep class com.huawei.hms.** {*;}
-keep interface com.huawei.hms.** {*;}
# lenovo
-keep class com.zui.deviceidservice.** { *; }
-keep class com.zui.opendeviceidlibrary.** { *; }
# meizu
-keep class com.meizu.flyme.openidsdk.** { *; }
# nubia
-keep class com.bun.miitmdid.provider.nubia.NubiaIdentityImpl
# oppo
-keep class com.heytap.openid.** { *; }
# samsung
-keep class com.samsung.android.deviceidservice.** { *; }
# vivo
-keep class com.vivo.identifier.** { *; }
# xiaomi -keep class com.bun.miitmdid.provider.xiaomi.IdentifierManager
# zte
-keep class com.bun.lib.** { *; }
# coolpad
-keep class com.coolpad.deviceidsupport.** { *; }
# EEBBK
#None
# honor
-keep class com.hihonor.** {*; }
# Gson
-keepattributes Signature
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
# Gson specific interfaces
-keep interface com.google.gson.** { *; }
# Gson specific fields
-keepclassmembers class * {
@com.google.gson.annotations.SerializedName &lt;fields&gt;;
}
# Enum types with Gson
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#hume
-keep class com.bytedance.hume.readapk.** {
*;
}
-keep class com.bytedance.** {
*;
}
-keep class com.tencent.** {*;}</code></pre>