未分类

Unity 接入 Sigmob SDK

在 Unity 项目中接入Sigmob 时,遇到很多问题,他们的文档写的也不是很清楚,特别是对于 Android 开发没有很深入了解的情况,读起来很困难,这篇博客记录了详细的 Sigmob 广告 sdk 接入过程。

1. 注册 Sigmob 开发者账户

这一步不需要过多解释,直接注册就行

2. 下载 Sigmob SDK 并导入到工程中

这一步,我接入的是 Sigmob SDk, 而不是聚合 SDK,看下面的图下载

Download

3. 下载移动安全联盟统一SDK并导入到工程中

根据sigmob的文档中说明,这个东西是用来获取设备标识的,可以根据sigmob文档中的地址去 MSA联盟官网注册并下载SDK,但是需要时间审核,我是直接从 Github 找的别人的Demo,然后从Demo里把这个SDK给拿出来用的,我用的 arr 文件是 msa_mdid_1.0.13.aar

这个东西还有一个配置文件,需要放到 Plugins/Android/assets目录下,文件名为 supplierconfig.json,文件内容如下,直接完整拷贝即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"supplier":{
"vivo":{
},
"xiaomi":{

},
"huawei":{

},
"oppo":{

}
}
}

msa_mdid_1.0.13.aar 放到 Plugins/Android/libs 目录下

4. 编写主 Activity 脚本,并放到 Unity 工程中

以前不知道居然可以直接将 java 文件放到 Unity 中,而不需要使用 Android Studio 等来建立 Android 库。在 Plugins/Android 下面建立一个名为 MainActivity.java 的文件,写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.treeland.singledout;        // 这一外包名和自己工程的包名一样即可

import android.os.Bundle;

import com.bun.miitmdid.core.ErrorCode;
import com.bun.miitmdid.core.JLibrary;
import com.bun.miitmdid.core.MdidSdkHelper;
import com.bun.supplier.IIdentifierListener;
import com.bun.supplier.IdSupplier;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;


public class MainActivity extends UnityPlayerActivity{

private long timeb, timee;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
JLibrary.InitEntry(MainActivity.this);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//初始化
}



public void GetOAID()
{
timeb = System.currentTimeMillis();
int errorCode = MdidSdkHelper.InitSdk(MainActivity.this, true, new IIdentifierListener() {
@Override
public void OnSupport(boolean b, IdSupplier idSupplier) {
if (idSupplier == null) {
return;
}
SendToUnity("OAID=" + idSupplier.getOAID());
timee = System.currentTimeMillis();
SendToUnity("耗时:" + (timee - timeb) + "毫秒");
}
});

if (errorCode == ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT) {
SendToUnity("获取OAID:" + "不支持的设备");
} else if (errorCode == ErrorCode.INIT_ERROR_LOAD_CONFIGFILE) {
SendToUnity("获取OAID:" + "加载配置文件出错");
} else if (errorCode == ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT) {
SendToUnity("获取OAID:" + "不支持的设备厂商");
} else if (errorCode == ErrorCode.INIT_ERROR_RESULT_DELAY) {
SendToUnity("获取OAID:" + "获取接口是异步的,结果会在回调中返回,回调执行的回调可能在工作线程");
} else if (errorCode == ErrorCode.INIT_HELPER_CALL_ERROR) {
SendToUnity("获取OAID:" + "反射调用出错");
} else {
SendToUnity("获取OAID:" + "获取成功");
}
}


// 发送消息给Unity
private void SendToUnity(String msg)
{
UnityPlayer.UnitySendMessage("Main Camera", "OnJavaMsg", msg);
}
}

5. 配置 AndroidManifest.xml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.treeland.singledout" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:networkSecurityConfig="@xml/network_security_config">
<provider android:name="com.sigmob.sdk.SigmobFileProvider" android:authorities="com.treeland.singledout.sigprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/sigmob_provider_paths" />
</provider>
<activity android:name="com.sigmob.sdk.base.common.AdActivity" android:theme="@android:style/Theme.DeviceDefault" android:configChanges="keyboardHidden|orientation|screenSize" />
<activity android:name="com.treeland.singledout.MainActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.lib_name" android:value="unity" />
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
</activity>
</application>
</manifest>

注册将上面代码中,所有的 com.treeland.singledout 字符串换成自己的 Unity 包名,即可,其他东西保持不变。如果第4步中建立的 java文件名不是 MainActivity,那就要修改上 AndroidManifest.xml 中的主 activity 的 android:name 属性,为自己的 Java 类名

6. 在工程中调用SDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using UnityEngine;
using System.Collections;
using Wind.Advertisements;

public class ADAgentForSigmob : MoeADAgent
{
public const string APPID = "1234";
public const string APPKEY = "47ab7721c597fa81";
public const string ADUNITID = "a5278ca96c9";

const string ADMission = "WatchAD";

public override void Init()
{
Advertisement.Init(APPID, APPKEY);
/* 广告加载成功 */
WindRewardVideoAdvertisement.Instance().SetAdLoadSuccessListener(OnAdLoadSuccessCallback);
/* 广告加载失败 */
WindRewardVideoAdvertisement.Instance().SetAdLoadFailedListener(OnAdErrorCallback);

/* 广告开始播放 */
WindRewardVideoAdvertisement.Instance().SetAdPlayListener(OnAdPlayStartCallback);

/* 广告点击 */
WindRewardVideoAdvertisement.Instance().SetAdClickedListener(OnAdClickedCallback);

/* 广告关闭 */
WindRewardVideoAdvertisement.Instance().SetAdClosedListener(OnAdClosedCallback);

/* 广告视频部分播放完毕 */
WindRewardVideoAdvertisement.Instance().SetAdVideoPlayEndListener(OnAdPlayEndCallback);

/* 广告播放失败 */
WindRewardVideoAdvertisement.Instance().SetAdPlayFailedListener(OnAdPlayErrorCallback);
}


#region "激励视频回调"

//广告加载成功,此时ready=true
private void OnAdLoadSuccessCallback(string placementId)
{
logicADReady = true;
Debug.Log("广告加载成功");
}


//广告开始播放
private void OnAdPlayStartCallback(string placementId)
{
logicADReady = false;
Debug.Log("广告开始播放");
TDGAMission.OnBegin(ADMission);
}


//广告播放出错
private void OnAdPlayErrorCallback(string placementId, Error error)
{
Debug.Log("广告播放出错");
}

//视频播放结束
private void OnAdPlayEndCallback(string placementId)
{
Debug.Log("广告播放结束");
}


//广告被点击
private delegate void OnAdClickedDelegate(string placementId);
private void OnAdClickedCallback(string placementId)
{
Debug.Log("广告被点击");
}

//广告关闭
private void OnAdClosedCallback(string placementId, RewardInfo info)
{
Debug.LogFormat("广告被关闭, 完整看完: {0}", info.IsCompletedView);
MoeEventManager.Inst.SendEvent((int)GameEvent.OnADClosed, new ADClosedParam(info.IsCompletedView));
logicADReady = false;
LoadAD();
if (info.IsCompletedView)
{
TDGAMission.OnCompleted(ADMission);
}
}

//广告加载出错
private void OnAdErrorCallback(string placementId, Error error)
{
Debug.Log("广告加载出错");
}

#endregion

public override void LoadAD()
{
Debug.Log("加载广告");
WindRewardVideoAdvertisement.Instance().LoadRequest(ADUNITID);
}

public override bool IsADReady()
{
return logicADReady && WindRewardVideoAdvertisement.Instance().Ready(ADUNITID);
}

public override void ShowAD()
{
Debug.Log("播放广告");
WindRewardVideoAdvertisement.Instance().PlayAd(ADUNITID);
}
}

上面的代码中,注意把 APPID APPKEY ADUNITID 换成自己项目的,继续的 MoeADAgent 改成 Monobehavior,然后把代码中的 Override 去掉就行

到此,Sigmob SDK 接入的整个流程结束,可以开始编包,如果报错,根据错误提示一点一点查找问题。

分享到