微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Unity获取设备OAID接入MSA移动安全联盟sdk

一、关于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,注意我的bundleIdcom.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,如果你已经有主Activityjava脚本,则直接在你原来的Activityjava脚本中添加接口即可。

在这里插入图片描述


注意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] 举报,一经查实,本站将立刻删除。

相关推荐