在 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,文件内容如下,直接完整拷贝即可

{
  "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 的文件,写入以下内容

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 文件

<?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 类名

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