文章目录
一、关于OAID
在 Android 10
版本中,广告渠道商们作为非厂商系统应用将无法获取 IMEI、MAC 等设备信息。旧版本的手机系统在用户手动升级前将保持不变,但是搭载Android 10
系统的手机系统将不支持获取IMEI
。在一段时间内,将处于新旧版手机系统共存的状态,但是新版手机系统的用户占比将会逐渐提高,会造成新版系统用户无法进行推广渠道的匹配。
(MSA)移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择 OAID 字段作为 IMEI 等的替代字段 。广告渠道商选择 OAID
作为IMEI
的替代字段。OAID
字段是由中国信通院联合华为、小米、OPPO、VIVO
等厂商共同推出的设备识别字段,具有一定的权威性。OAID
的准确性和覆盖率均满足广告场景的使用需求。
关于 OAID
更多信息可参考 MSA移动安全联盟官网: http://www.msa-alliance.cn/col.jsp?id=120
二、GitHub工程
收到比较多反馈,我把本文我的Unity
工程上传到GitHub
,有需要的同学自取:
https://github.com/linxinfa/Unity-GetOAID
三、实现流程
四、 最终运行效果
华为手机上运行效果
五、具体实操
1、下载sdk (miit_mdid_x.x.x.zip)
方法一:
进入MSA
移动安全联盟官网: http://www.msa-alliance.cn/col.jsp?id=120 下载miit_mdid_x.x.x.aar
方法二:
如果官网找不到下载的地方,就进入我自己的链接下吧
链接:https://pan.baidu.com/s/1ES9_tmQqZt0E7FApwhzVXQ
提取码:x3fo
新版sdk下载见文章末尾。
2、解压sdk
下载下来后,解压,会看到如下的文件
进入目录miit_mdid_sdk_v1.0.13
,可以看到一个.aar
文件和一个.json
文件
3、导入文件到Unity中
把msa_mdid_1.0.13.aar
丢到Unity
工程的Assets/Plugins/Android/libs
目录中;
把supplierconfig.json
丢到Unity
工程的Assets/Plugins/Android/assets
目录中;
注:其中
supplierconfig.json
内容如下,不配置具体的渠道appid
也可正常工作
{
"supplier":
{
"vivo":{},
"xiaomi":{},
"huawei":{},
"oppo":{}
}
}
4、Androidmanifest
在Unity
工程的Assets/Plugins/Android
目录中创建Androidmanifest.xml
(如果你已经有Androidmanifest.xml
则无需创建)
添加以下权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
//asus permisstion
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
如下是我的Androidmanifest.xml
,注意我的bundleId
是com.linxinfa.oaidtest
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.linxinfa.oaidtest"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
//asus permisstion
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
<application>
<activity android:name="com.linxinfa.oaidtest.MainActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<Meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
5、封装java接口
在Unity
工程的Assets/Plugins/Android/src
目录下创建MainActivity.java
,如果你已经有主Activity
的java
脚本,则直接在你原来的Activity
的java
脚本中添加接口即可。
注意
MainActivity
继承UnityPlayerActivity
。封装一个
GetoAID
接口,MainActivity.java
代码如下:
package com.linxinfa.oaidtest;
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);
}
}
6、Unity C#调用java接口获取OAID
创建些简单的UI
,写个Main.cs
脚本,挂到Main Camera
上,绑定Main
脚本的UI
成员对象。
Main.cs
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehavIoUr
{
public Button getoaidBtn;
public Text logLbl;
void Start()
{
logLbl.text = "";
Application.logMessageReceived += LogCallback;
getoaidBtn.onClick.AddListener(() =>
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
// 调用java接口
jo.Call("GetoAID");
}
}
});
}
// java那边通过UnityPlayer.UnitySendMessage发送过来的消息
public void OnJavaMsg(string msg)
{
Debug.Log(msg);
}
// 日志监听
public void LogCallback(string condition, string stackTrace, LogType type)
{
logLbl.text += condition + "\n";
}
}
7、Unity打包
打包时注意包名,比如我的是com.linxinfa.oaidtest
六、补充:最新版sdk下载(1.0.25)
更: 2021/5/18
不少同学问我要最新版sdk
,这个是目前最新版本的sdk
。
链接:https://pan.baidu.com/s/16Ww5FMjtVRYPpSGyEwWy2A
提取码:kfx8
注:仅供学习使用,如果用于商业用途,请前往移动安全联盟官网下载:http://www.msa-alliance.cn/col.jsp?id=120。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。