android sdk对接文档
<p>[toc]</p>
<h2>1. 接入准备</h2>
<h3>1.1 sdk下载</h3>
<p>sdk:<a href="https://files.hzy211.com/hzy/android-sdk_1.0.1.zip">v1.0.1.zip</a>(内包含 demo)</p>
<h3>1.2 版本支持</h3>
<ol>
<li>minSdkVersion >= 21</li>
<li>targetSdkVersion >= 30</li>
</ol>
<h3>1.3 接入注意</h3>
<ol>
<li>接入前请先联系运营获取 game_id,包名对应的极光参数</li>
<li><span style="color: red; ">超级重要提示!!!</span>
<ol>
<li>强烈建议参考demo接入</li>
<li>游戏包的targetSdkVersion不得低于30,否则渠道过不了审核</li>
<li>游戏的任何获取用户信息的操作,包括但不限于获取手机设备码,获取存储权限。都必须放在我方SDK初始化回调之后。否则过不了媒体审核</li>
</ol></li>
</ol>
<h2>2. 开始接入</h2>
<h3>2.1 Android Studio接入sdk,配置gradle<font color='red'>(必须)</font></h3>
<pre><code class="language-java">// 省略原有配置
android {
defaultConfig{
// 根据游戏需要保留架构库种类
ndk {
abiFilters 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'x86', 'x86_64'
}
// 如果是eclipse接入的,将aar解压出来后修改清单文件对应字段即可,比如下面的JPUSH_APPKEY 在清单文件里面就是${JPUSH_APPKEY}。
manifestPlaceholders = [
JPUSH_APPKEY : &quot;060f6fa5e125b37022b78d7e&quot;, // 极光的appKey参数,运营提供
JPUSH_CHANNEL: &quot;developer-default&quot;, // 暂时填写默认值即可.
]
}
}
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.4'
implementation 'android.arch.navigation:navigation-fragment:1.0.0'
implementation 'android.arch.navigation:navigation-ui:1.0.0'
// SDK依赖开始
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
implementation 'com.android.support:recyclerview-v7:27.0.2'
// SDK依赖结束
}</code></pre>
<h3>2.2 清单配置<font color='red'>(必须)</font></h3>
<p>AndroidManifest.xml 清单配置, game_id 参数请联系运营获取。</p>
<pre><code class="language-xml">
&lt;application&gt;
&lt;!-- game_id替换成运营给到的game_id --&gt;
&lt;meta-data
android:name=&quot;_HZY_GAME_ID&quot;
android:value=&quot;game_id&quot;/&gt;
&lt;meta-data
android:name=&quot;_HZY_CHANNEL_KEY&quot;
android:value=&quot;HZYSDK&quot;/&gt;
&lt;/application&gt;</code></pre>
<h3>2.3 application继承<font color='red'>(必须)</font></h3>
<pre><code class="language-java">public class DemoApplication extends com.hzy.game.sdk.HZYApplication {
@Override
public void onCreate() {
super.onCreate();
}
}</code></pre>
<h3>2.4 闪屏Activity接入<font color='red'>(必须)</font></h3>
<pre><code class="language-java">public class SplashActivity extends HZYSplashActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 请不要调用被重载的父类方法
// super.onActivityResult(requestCode, resultCode, data);
// 检查用户是否同意使用 app
if (requestCode == Constants.REQUEST_PERMISSIONS_CODE &amp;&amp; resultCode == Constants.REQUEST_PERMISSIONS_DENIED) {
// 用户拒绝使用app
finish();
} else if (requestCode == Constants.REQUEST_PERMISSIONS_CODE
&amp;&amp; resultCode == Constants.REQUEST_PERMISSIONS_GRANTED) {
// 用户同意使用app
try {
// 游戏主activity MainActivity.class
// 或者使用 Class.forName()
// Intent intent = new Intent(this, Class.forName(&quot;com.xxxx.MainActivity&quot;));
Intent intent = new Intent(this, NewApiMainActivity.class);
startActivity(intent);
finish();
}catch (Exception e){
e.printStackTrace();
}
}
}
}</code></pre>
<h3>2.5 初始化<font color='red'>(必须)</font></h3>
<pre><code class="language-java">HZYGameSDK.getInstance().init(this, new HZYGameSDK.HZYGameSDKListener() {
@Override
public void onInitResult(boolean isSuccess) {
isInit = isSuccess;
}
@Override
public void onPayResult(boolean isSuccess) {
HZYLog.i(&quot;onPayResult&quot;);
}
@Override
public void onLoginResult(boolean isSuccess, String token, String userId) {
HZYLog.i(&quot;onLoginResult&quot;);
HZYLog.i(&quot;Token:&quot; + token);
HZYLog.i(&quot;userid: &quot; + userId);
isLogin = isSuccess;
}
@Override
public void onExit() {
NewApiMainActivity.this.finish();
}
@Override
public void onLogout() {
HZYLog.i(&quot;onLogout&quot;);
}
});</code></pre>
<h3>2.6 登录<font color='red'>(必须)</font></h3>
<pre><code class="language-java"> HZYGameSDK.getInstance().login(this);</code></pre>
<h3>2.7 登出<font color='red'>(必须)</font></h3>
<pre><code class="language-java"> HZYGameSDK.getInstance().logout(this);</code></pre>
<h3>2.8 退出<font color='red'>(必须)</font></h3>
<pre><code class="language-java">HZYGameSDK.getInstance().exit(this);</code></pre>
<h3>2.9 支付<font color='red'>(必须)</font>)</h3>
<pre><code class="language-java">HZYPayParams params = new HZYPayParams();
params.setBuyNum(1); // 写默认1
params.setCoinNum(100); // 写默认100
params.setExtension(String.valueOf(System.currentTimeMillis()));
params.setPrice(money); // 单位是元
params.setProductId(&quot;com.hzygame.demo1&quot;); // 产品id
params.setProductName(&quot;元宝&quot;);// 产品名称
params.setProductDesc(&quot;购买100元宝&quot;);// 描述
params.setRoleId(&quot;123456&quot;);// 角色id
params.setRoleLevel(Integer.parseInt(&quot;1&quot;)); // 当前角色等级,未获取到角色等级时传0
params.setRoleName(&quot;战国无双&quot;);// 角色未获取或未创建时传空字符串
params.setServerId(&quot;1&quot;);// 服务器id
params.setServerName(&quot;测试&quot;);// 未获取到服务器名称时传空字符串
params.setVip(&quot;vip1&quot;);// VIP等级
HZYGameSDK.getInstance().pay(NewApiMainActivity.this, params);</code></pre>
<h3>2.10 角色上报<font color='red'>(必须)</font></h3>
<pre><code class="language-java">HZYUserExtraData extraData = new HZYUserExtraData();
extraData.setDataType(type); // 调用时机,具体见文档
extraData.setServerID(&quot;1&quot;); // 未获取到服务器时传0
extraData.setServerName(&quot;测试demo服务器&quot;); // 未获取到服务器名称时传null
extraData.setRoleName(&quot;战国无双&quot;); // 角色未获取或未创建时传null
extraData.setRoleLevel(&quot;1&quot;); // 当前角色等级,未获取到角色等级时传null
extraData.setRoleID(&quot;123456&quot;); // 当前角色id,未获取角色id时传null
extraData.setMoneyNum(0 + &quot;&quot;); // 玩家身上元宝数量,拿不到或者未获取时传0s
extraData.setRoleCreateTime(new Date().getTime() / 1000);//角色创建时间,
extraData.setGuildId(&quot;GH10001&quot;);// 公会id,无公会或未获取时传null
extraData.setGuildName(&quot;公会名称&quot;);// 公会名称,无公会或未获取时传null
extraData.setGuildLevel(100 + &quot;&quot;);// 公会等级,无公会或未获取时传0
extraData.setGuildLeader(&quot;公会会长名&quot;);// 公会会长名称,无公会或未获取时传null
extraData.setPower(Long.parseLong(&quot;1000000&quot;)); // 角色战斗力, 不能为空,必须是数字,不能为null,若无,传0
extraData.setProfessionid(123);// 职业ID,不能为空,必须为数字,若无,传入 0
extraData.setProfession(&quot;职业名称&quot;);// 职业名称,不能为空,不能为 null,若无,传入 “无”
extraData.setGender(&quot;性别&quot;);// 角色性别,不能为空,不能为 null,可传入参数“ 男、女、无”
extraData.setProfessionroleid(123);// 职业称号ID,不能为空,不能为 null,若无,传入 0
extraData.setProfessionrolename(&quot;职业称号&quot;);// 职业称号,不能为空,不能为 null,若无,传入“ 无”
extraData.setVip(&quot;1&quot;);// 玩家VIP等级,不能为空,必须为数字,若无,传入 0
extraData.setGuildroleid(123);// 帮派称号 ID,帮派会长/帮主必传 1,其他可自定义,不能为空,不能为
// null,若无,传入 0
extraData.setGuildrolename(&quot;帮派称号名称&quot;);// 帮派称号名称,不能为空,不能为 null,若无,传入“无”
extraData.setExtension(&quot;{}&quot;);//拓展字段
//其他场景上报用这句
HZYGameSDK.getInstance().submitExtendData(TestActivity.this, extraData);</code></pre>
<ul>
<li>dataType 可选值</li>
</ul>
<table>
<thead>
<tr>
<th>数值</th>
<th>时机</th>
<th>常量名</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>选择服务器</td>
<td>Constants._HZY_CHOICE_SERVER</td>
</tr>
<tr>
<td>2</td>
<td><font color="red">创建角色(必接)</font></td>
<td>Constants._HZY_CREATE_ROLE</td>
</tr>
<tr>
<td>3</td>
<td><font color="red">进入游戏(必接)</font></td>
<td>Constants._HZY_ENTER_GAM</td>
</tr>
<tr>
<td>4</td>
<td><font color="red">等级提升(必接)</font></td>
<td>Constants._HZY_LEVEL_UP</td>
</tr>
<tr>
<td>5</td>
<td>退出游戏</td>
<td>Constants._HZY_OUT_GAME</td>
</tr>
<tr>
<td>6</td>
<td>条件数据上报(按需接入)</td>
<td>6</td>
</tr>
</tbody>
</table>
<h3>2.11 生命周期<font color='red'>(必须)</font></h3>
<pre><code class="language-java">public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
HZYGameSDK.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
HZYGameSDK.getInstance().onActivityResult(requestCode, resultCode, data, this);
}
public void onCreate(@Nullable Bundle savedInstanceState) {
HZYGameSDK.getInstance().onCreate(savedInstanceState);
}
public void onStart() {
HZYGameSDK.getInstance().onStart();
}
public void onDestroy() {
HZYGameSDK.getInstance().onDestroy();
}
public void onResume() {
HZYGameSDK.getInstance().onResume();
}
public void onPause() {
HZYGameSDK.getInstance().onPause();
}
public void onRestart() {
HZYGameSDK.getInstance().onRestart();
}
public void onStop() {
HZYGameSDK.getInstance().onStop();
}
public void onSaveInstanceState(Bundle outState) {
HZYGameSDK.getInstance().onSaveInstanceState(outState);
}
public void onNewIntent(Intent intent) {
HZYGameSDK.getInstance().onNewIntent(intent);
}
public void onConfigurationChanged(Configuration newConfig) {
HZYGameSDK.getInstance().onConfigurationChanged(newConfig);
}</code></pre>