SDK初始化
1、拷贝资源
将SDK_Lib文件夹中的资源(assets, libs, res)全部拷贝到工程对应的目录下。
- Demo:DHUnionSDK接入的参考示例。
- SDK_Lib:DHUnionSDK所需的依赖文件,必须拷贝(assets, libs, res)中的全部文件。
Demo:在AndroidManifest清单中加入了登录和支付相关的参数插件配置。接入者需将清单中的dh_appId、dh_regCode修改为游戏在开放平台申请的相应参数。清单中除了dh_appId、dh_appKey、dh_regCode之外的配置在平台出包时可能会被替换。
2、清单配置(统一必接)
2.1、功能配置
2.1.1、配置Manifest
必须接入此配置,否则可能会出现启动失败或功能异常的情况。
<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="false" /> <!-- 无需变动 -->
        <uses-library android:name="org.apache.http.legacy" android:required="false" /> <!-- 无需变动 -->
        <!-- SDK END -->
    </application>
</manifest>
2.1.2、配置Application
必须接入此配置,否则可能会出现启动失败或功能异常的情况。
方式一:
若游戏已有自定义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>
3、设置全局回调
IDHSDKCallback:接入方用于统一接收Union SDK回调结果,通过onDHSDKResult()接收回调数据。
此回调尽量只创建一个统一处理所有功能的回调,尽量不要在每个接口传入不同回调。
每个接口传入的回调对象,需要实现onDHSDKResult(requestCode, resultCode, resultData)处理回调。
import com.dh.DHSDKConst;
import com.dh.callback.IDHSDKCallback;
public class DHSDKCallback 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 | 根据不同请求类型返回处理数据 | 
4、生命周期回调(必接)
推荐可建立BaseActivity,将游戏所有Activity继承该BaseActivity,以此只需重写一次。
其中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);
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        DHSDKHelper.getInstance().onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }   
}
5、调用初始化接口(必接)
SDK初始化是游戏或应用接入的第一个接口,SDK支持的所有登录支付、分享等插件都会在初始化时统一初始化,请接入者在初始化成功后进行其他插件接口调用。
初始化示例:
import com.dh.DHSDKHelper;
/**
 * @param activity    上下文
 * @param sdkCallback 回调对象
 */
DHSDKHelper.getInstance().init(activity, sdkCallback);
初始化接口一般在onCreate()方法中调用,或游戏界面加载显示后再调用(避免黑屏)!
回调对象示例如下:
public class DHSDKCallback 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;
        }
    }
}
插件表:
- 登录支付插件
- 数据统计插件
- 分享插件
- 广告插件
- 客服插件
- 推送通知插件
- 语音插件
返回成功数据:
init ok: { [1 : init ok] [2 : operation ok] [3 : No.3 plugin empty ] [4 : No.4 plugin empty ] [5 : No.5 plugin empty ] [6 : No.6 plugin empty ] [7 : No.7 plugin empty ] [8 : No.8 plugin empty ] }
返回失败数据:
init fail: { [1 : No.1 plugin empty] [2 :No.2 plugin empty] [3 : No.3 plugin empty ] [4 : No.4 plugin empty ] [5 : No.5 plugin empty ] [6 : No.6 plugin empty ] [7 : No.7 plugin empty ] [8 : No.8 plugin empty ] }