# 接入准备(必读)
# 1、拷贝资源
将SDK_Lib文件夹中的资源(assets, libs, res)
全部拷贝到工程对应的目录下。
TIP
- Demo:DHUnionSDK接入的参考示例。
- SDK_Lib:DHUnionSDK所需的依赖文件,必须拷贝
(assets, libs, res)
中的全部文件。
WARNING
Demo:在AndroidManifest清单中加入了登录和支付相关的参数插件配置。接入者需将清单中的dh_appId、dh_regCode修改为游戏在开放平台申请的相应参数。清单中除了dh_appId、dh_appKey、dh_regCode之外的配置在平台出包时可能会被替换。
# 2、清单配置(统一必接)
# 2.1、功能配置
# 2.1.1、配置Manifest
WARNING
必须接入此配置,否则可能会出现启动失败或功能异常的情况。
<manifest>
<!-- SDK -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- SDK END -->
<application
android:name="com.dh.framework.app.DHApplication"
android:usesCleartextTraffic="true"> <!-- 按需变动 -->
<!-- SDK -->
<meta-data android:name="dh_appId" android:value="1696674719" /> <!-- 替换参数 -->
<meta-data android:name="dh_regCode" android:value="******" /> <!-- 替换参数 -->
<meta-data android:name="dh_channelId" android:value="1000" /> <!-- 无需变动 -->
<meta-data android:name="dh_channelName" android:value="test" /> <!-- 无需变动 -->
<meta-data android:name="dh_mainchannel" android:value="0" /> <!-- 无需变动 -->
<meta-data android:name="dh_secochannel" android:value="0" /> <!-- 无需变动 -->
<meta-data android:name="dh_mode" android:value="1" /> <!-- 无需变动 -->
<meta-data android:name="dh_payType" android:value="1" /> <!-- 无需变动 -->
<meta-data android:name="dh_signinType" android:value="1" /> <!-- 无需变动 -->
<meta-data android:name="dh_unified_field" android:value="true" /> <!-- 无需变动 -->
<uses-library android:name="org.apache.http.legacy" android:required="false" /> <!-- 无需变动 -->
<!-- SDK END -->
</application>
</manifest>
# 2.1.2、配置Application
WARNING
必须接入此配置,否则可能会出现启动失败或功能异常的情况。
方式一:
若游戏已有自定义Application
,需改为继承com.dh.framework.app.DHApplication
import com.dh.framework.app.DHApplication;
public class GameApplication extends DHApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
同时需要在AndroidManifest.xml
文件的<application>
标签中进行如下配置:
<application android:name="xxx.xxx.xxx.GameApplication">
...
</application>
方式二:
若游戏没有自定义Application
,则直接在AndroidManifest.xml
文件的<application>
标签中进行如下配置:
<application android:name="com.dh.framework.app.DHApplication">
...
</application>
# 2.2、查询配置
调用代码示例如下:
import com.dh.DHSDKHelper;
/**
* @param key 需要查询的配置名称
* @return 返回字符串,不会出现null情况
*/
String value = DHSDKHelper.query(key);
接口说明:
- 可以查询SDK私有SharedPreferences中所有插入的数据。
- 可以查询AndroidManifest中meta-data配置的所有数据,其中
key
为配置项的android:name
属性值。
配置信息,主要参数说明如下:
key | 别名 | 示例 | 备注 |
---|---|---|---|
dh_appId | 开放平台AppID | ||
dh_channelId | 渠道编号 | 1058(官方安卓)、1013(官方iOS) | 安卓/苹果Key相同(一级渠道) |
dh_channelName | 渠道名称 | ||
dh_mainchannel | CPS主渠道 | 100001 | 玩家广告来源渠道(二级渠道) |
dh_secochannel | CPS次渠道 | 100002 | 玩家广告来源渠道(三级渠道) |
dev_os | 设备系统 | ||
dev_uuid | 设备唯一ID | ||
dev_brand | 设备品牌 | ||
dev_model | 设备型号 | ||
firebase_messaging_token | firebase推送token | ||
dh_mode | 国内海外标识 | 国内为1 ,海外为0 |
# 3、接入注意事项
代码混淆
SDK部分代码会用到反射,若开启了混淆,请在proguard-rules.pro
中配置如下规则。若同时混淆了资源,需要将SDK资源加入白名单,建议尽量避免混淆母包
-keep class com.dh.** {*;}
-dontwarn com.dh.**
-keep class okhttp3.** {*;}
-dontwarn okhttp3.**
-keep class com.dhsdk.** {*;}
-dontwarn com.dhsdk.**
-keepresourcefiles res/**
-keepresourcefiles assets/**
清单配置
SDK部分代码会用Apache的HTTP库进行网络通信,若Android的targetSdkVersion
值大于28,则可能会报错。解决方法是请在AndroidManifest.xml
中配置以下内容:
<application
... >
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
</application>
这种配置将允许应用继续使用Apache HTTP库,从而避免由于API级别变化导致的错误。
# 4、设置全局回调
IDHSDKCallback:接入方用于统一接收SDK回调结果,通过onDHSDKResult()
接收回调数据。此回调应尽量只创建一个统一处理所有功能的回调,避免在每个接口中传入不同的回调。
TIP
每个接口传入的回调对象,需要在onDHSDKResult(requestCode, resultCode, resultData)
方法中处理相应的回调码。
import com.dh.DHSDKConst;
import com.dh.callback.IDHSDKCallback;
public class GameUnifiedCallback implements IDHSDKCallback {
@Override
public void onDHSDKResult(int requestCode, int resultCode, String resultData) {
switch (requestCode) {
case DHSDKConst.REQ_INIT:
// 初始化
if (resultCode == DHSDKConst.RET_OK) {
// 初始化成功
} else if (resultCode == DHSDKConst.RET_FAIL) {
// 初始化失败
}
break;
case DHSDKConst.REQ_EXIT:
// 退出游戏
if (resultCode == DHSDKConst.RET_OK) {
// 退出游戏成功
} else if (resultCode == DHSDKConst.RET_FAIL) {
// 退出游戏失败
}
break;
case DHSDKConst.REQ_PAY:
// 支付结果
if (resultCode == DHSDKConst.RET_OK) {
// 支付结束
} else if (resultCode == DHSDKConst.RET_FAIL) {
// 支付失败
}
break;
case DHSDKConst.REQ_LOGIN:
// 登录结果
if (resultCode == DHSDKConst.RET_OK) {
// 登录成功
} else if (resultCode == DHSDKConst.RET_FAIL) {
// 登录失败
}
break;
case DHSDKConst.REQ_LOGIN_OUT:
// 退出登录
if (resultCode == DHSDKConst.RET_OK) {
// 退出登录成功
} else if (resultCode == DHSDKConst.RET_FAIL) {
// 退出登录失败
}
break;
case 105:
// 屏幕变化
if (resultCode == DHSDKConst.RET_OK) {
// 折叠变化成功
// resultData示例:{"width":1920,"height":1080}
} else if (resultCode == DHSDKConst.RET_FAIL) {
// 折叠变化失败
}
break;
default:
// 其他结果
break;
}
}
}
回调参数相应类型如下:
参数 | 类型 | 值 | 说明 |
---|---|---|---|
requestCode | Int | DHSDKConst.REQ_INIT | 初始化 |
DHSDKConst.REQ_EXIT | 退出游戏 | ||
DHSDKConst.REQ_LOGIN | 登录结果 | ||
DHSDKConst.REQ_LOGIN_OUT | 退出登录 | ||
DHSDKConst.REQ_PAY | 支付结果 | ||
DHSDKConst.REQ_LINK | 账号绑定 | ||
105 | 屏幕变化 | ||
resultCode | Int | DHSDKConst.RET_OK | 成功标志 |
DHSDKConst.RET_FAIL | 失败标志 | ||
resultData | String | 根据不同请求接口返回相应的处理数据 |
# 5、生命周期回调(统一必接)
推荐建立一个BaseActivity
,并让游戏中的所有Activity
继承该BaseActivity
,这样只需重写一次相关方法。
DANGER
其中,onDestroy()
方法只需在主Activity中调用一次。该方法用于在程序最终关闭时释放变量引用,若在游戏中途调用,将导致无法调用SDK。
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import com.dh.DHSDKHelper;
public class BaseActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
DHSDKHelper.getInstance().onCreate(this);
}
@Override
protected void onStart() {
super.onStart();
DHSDKHelper.getInstance().onStart(this);
}
@Override
protected void onResume() {
super.onResume();
DHSDKHelper.getInstance().onResume(this);
}
@Override
protected void onPause() {
super.onPause();
DHSDKHelper.getInstance().onPause(this);
}
@Override
protected void onStop() {
super.onStop();
DHSDKHelper.getInstance().onStop(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
DHSDKHelper.getInstance().onDestroy(this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
DHSDKHelper.getInstance().onNewIntent(this, intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, requestCode, data);
DHSDKHelper.getInstance().onActivityResult(this, requestCode, resultCode, data);
}
@Override
public void onBackPressed() {
super.onBackPressed();
DHSDKHelper.getInstance().onBackPressed(this);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
DHSDKHelper.getInstance().onConfigurationChanged(newConfig);
}
}
# 6、调用初始化接口(统一必接)
SDK初始化是游戏或应用接入的第一个接口。SDK支持的所有登录、支付、分享等插件都将在初始化时统一初始化。请接入方在初始化成功后进行其他插件接口的调用。
调用代码示例如下:
import com.dh.DHSDKHelper;
/**
* @param activity 上下文
* @param sdkCallback 回调对象
*/
DHSDKHelper.getInstance().init(activity, gameUnifiedCallback);
DANGER
初始化接口一般在onCreate()
方法中调用,或游戏界面加载显示后再调用(避免黑屏)!
回调对象示例如下:
import com.dh.DHSDKConst;
import com.dh.callback.IDHSDKCallback;
public class GameUnifiedCallback implements IDHSDKCallback {
@Override
public void onDHSDKResult(int requestCode, int resultCode, String resultData) {
switch (requestCode) {
case DHSDKConst.REQ_INIT:
// 初始化
if (resultCode == DHSDKConst.RET_OK) {
// 初始化成功
} else if (resultCode == DHSDKConst.RET_FAIL) {
// 初始化失败
}
break;
default:
// 其他结果
break;
}
}
}