Unity 之 获取手机:OAID、IMEI、ClientId、GUID
- 前言
- 一、Oaid 介绍
- 1.1 Oaid 说明
- 1.2 移动安全联盟(MSA)
- 二、站在巨人的肩膀上
- 2.1 本文实现参考
- 2.2 本文实现效果
- 2.3 本文相关插件
- 三、Unity 中获取Oaid
- 3.1 查看实现源码
- 3.2 工程配置
- 3.3 代码实现
- 3.4 场景搭建
- 四、总结
前言
在当今的移动互联网时代,Oaid(Open Anonymous ID)成为了广告投放和用户分析的重要工具。对于 Unity 游戏开发者来说,获取安卓手机的 Oaid 可以帮助他们更好地了解用户行为、优化广告投放效果,并提供个性化的游戏体验。
我了解到Oaid还是在TapADN中,TapADN中提到Oaid可以提供更高收益:
本文将介绍如何在 Unity 中获取安卓手机的 Oaid。
一、Oaid 介绍
1.1 Oaid 说明
Oaid 是一种匿名设备标识符,用于标识移动设备。它与 IMEI 等设备标识符不同,Oaid 不会泄露用户的真实身份信息,同时也能满足广告投放和用户分析的需求。通过获取 Oaid,开发者可以了解用户的设备信息、地理位置、兴趣爱好等,从而为用户提供更加精准的广告投放和个性化的服务。
在 Android 10 版本中,广告渠道商们作为非厂商系统应用将无法获取 IMEI、MAC 等设备信息。旧版本的手机系统在用户手动升级前将保持不变,但是搭载 Android 10 系统的手机系统将不支持获取 IMEI。在一段时间内,将处于新旧版手机系统共存的状态,但是新版手机系统的用户占比将会逐渐提高,会造成新版系统用户无法进行推广渠道的匹配。
1.2 移动安全联盟(MSA)
(MSA)移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择 OAID 字段作为 IMEI 等的替代字段 。广告渠道商选择 OAID 作为 IMEI 的替代字段。OAID 字段是由中国信通院联合华为、小米、OPPO、VIVO 等厂商共同推出的设备识别字段,具有一定的权威性。OAID 的准确性和覆盖率均满足广告场景的使用需求。
关于 OAID 更多信息可参考 MSA移动安全联盟官网: http://www.msa-alliance.cn/col.jsp?id=120
我注册并下载了MAD的SDK,看了开发说明文档,感觉集成操作有点复杂。进而有了本文的实现方式:
二、站在巨人的肩膀上
2.1 本文实现参考
查到了相关的实现方式【膜拜大佬】
参考链接:
- Unity Android获取OAID码
- Android_CN_OAID
2.2 本文实现效果
下图1是本文最终的实现效果,图2图3是1.3中大佬提供的apk的测试结果参照
2.3 本文相关插件
在文章开头的资源绑定中有源码和本文使用的最新library-4.2.8.aar包(下载地址),使用是可打开看下是否有新的。
开头提供的资源包内容:
三、Unity 中获取Oaid
3.1 查看实现源码
在 Unity 中,可以通过调用插件提供的接口来获取 Oaid。具体的获取方法可以参考DeviceIdentifier.java类代码。
一般来说,需要在游戏启动时获取 Oaid,并将其存储在本地,以便后续使用。
3.2 工程配置
在Project Setting→Player→安卓→Publishing Settings→Build 下勾选如下图所示三项,此时工程会自动生成左侧框到三个文件:
3.3 代码实现
在settingsTemplate.gradle,添加以下内容,粘贴两次,位置如图所示。
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://developer.hihonor.com/repo' }
新建JAVA代码:
package com.GetOaid;
import android.app.Application;
import android.app.Activity;
import com.unity3d.player.UnityPlayer;
import com.github.gzuliyujiang.oaid.DeviceIdentifier;
import com.github.gzuliyujiang.oaid.IRegisterCallback;
public class OaidWrapper
{
private Application application;
public void register()
{
application = UnityPlayer.currentActivity.getApplication();
DeviceIdentifier.register(application, false, new IRegisterCallback() {
@Override
public void onComplete(String clientId, Exception error) {
// do something
UnityPlayer.UnitySendMessage("GetOaidSDK", "GetClientIdComplete", clientId);
}
});
}
public String getOAID()
{
UnityPlayer.UnitySendMessage("GetOaidSDK", "ShowMsg", DeviceIdentifier.getOAID(application));
return DeviceIdentifier.getOAID(application);
}
public String getIMEI()
{
UnityPlayer.UnitySendMessage("GetOaidSDK", "ShowMsg", DeviceIdentifier.getIMEI(application));
return DeviceIdentifier.getIMEI(application);
}
public String getClientId()
{
UnityPlayer.UnitySendMessage("GetOaidSDK", "ShowMsg", DeviceIdentifier.getClientId());
return DeviceIdentifier.getClientId();
}
public String getGUID()
{
UnityPlayer.UnitySendMessage("GetOaidSDK", "ShowMsg", DeviceIdentifier.getGUID(application));
return DeviceIdentifier.getGUID(application);
}
}
3.4 场景搭建
创建两个Text展示获取到的信息,为了方便调试。在创建四个按钮用于测试主动获取OAID、IMEI、ClientId、GUID。新建GetOaidSDK
的物体挂载代码
新建测试代码:
- 需要将3.3中代码挂载到名为
GetOaidSDK
的物体上。 jo = new AndroidJavaObject("com.GetOaid.OaidWrapper");
要和上面创建的java文件中的包名和类名对应上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.UI;
public class GetOaidDemo : MonoBehaviour
{
public Text oaidText;
public Text megText;
public Button getOaidBtn;
public Button getIMEIBtn;
public Button getClientIdBtn;
public Button getGUIDBtn;
public Button getOAIDAAIDBtn;
private static AndroidJavaObject jo;
// 读取设备信息 权限
private string READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
void Start()
{
getOaidBtn.onClick.AddListener(OnClickGetOAID);
getIMEIBtn.onClick.AddListener(OnClickGetIMEI);
getClientIdBtn.onClick.AddListener(OnClickGetClientId);
getGUIDBtn.onClick.AddListener(OnClickGetGUID);
getOAIDAAIDBtn.onClick.AddListener(OnClickGetOAIDAAID);
// 请求READ_PHONE_STATE权限
RequestAndCheckPermission();
}
public void RequestAndCheckPermission()
{
Debug.Log("检查请求权限");
if (!Permission.HasUserAuthorizedPermission(READ_PHONE_STATE))
{
Permission.RequestUserPermission(READ_PHONE_STATE);
// 开始协程等待权限变化
StartCoroutine(WaitForPermission(READ_PHONE_STATE));
}
else
{
// 权限已授予,执行操作
Debug.Log("权限已授予,执行相关操作");
Register();
}
}
IEnumerator WaitForPermission(string permission)
{
float timeWaited = 0f;
const float timeout = 10f; // 设置超时时间,防止无限等待
while (!Permission.HasUserAuthorizedPermission(permission) && timeWaited < timeout)
{
yield return new WaitForSeconds(0.2f); // 暂停并检查权限状态
timeWaited += 0.2f;
}
if (Permission.HasUserAuthorizedPermission(permission))
{
Debug.Log($"Permission {permission} granted after waiting.");
// 在这里处理权限被授予的逻辑
ShowMsg("这里可以执行需要该权限的操作.");
}
else
{
Debug.LogWarning($"Permission {permission} not granted after waiting.");
// 处理权限请求超时或被拒绝的情况
ShowMsg($"处理权限请求超时或被拒绝的情况.");
}
}
public void Register()
{
if (Application.platform == RuntimePlatform.Android)
{
jo = new AndroidJavaObject("com.GetOaid.OaidWrapper");
jo.Call("register");
}
}
// 渠道clientId 自动获取oaid
public void GetClientIdComplete(string clientId)
{
oaidText.text = "clientId:" + clientId;
OnClickGetOAID();
}
public void OnClickGetOAID()
{
oaidText.text += ",取Oaid:";
if (Application.platform == RuntimePlatform.Android)
{
jo = new AndroidJavaObject("com.GetOaid.OaidWrapper");
string oaidStr = jo.Call<string>("getOAID");
oaidText.text += oaidStr;
Debug.Log("取Oaid:" + oaidStr);
}
}
public void OnClickGetOAIDAAID()
{
oaidText.text += ",getOAIDAAID:";
if (Application.platform == RuntimePlatform.Android)
{
jo = new AndroidJavaObject("com.GetOaid.OaidWrapper");
string oaidStr = jo.Call<string>("getOAIDAAID");
oaidText.text += oaidStr;
Debug.Log("getOAIDAAID:" + oaidStr);
}
}
public void OnClickGetIMEI()
{
oaidText.text += ",getIMEI:";
if (Application.platform == RuntimePlatform.Android)
{
jo = new AndroidJavaObject("com.GetOaid.OaidWrapper");
string oaidStr = jo.Call<string>("getIMEI");
oaidText.text += oaidStr;
Debug.Log("getIMEI:" + oaidStr);
}
}
public void OnClickGetClientId()
{
oaidText.text += ",getClientId:";
if (Application.platform == RuntimePlatform.Android)
{
jo = new AndroidJavaObject("com.GetOaid.OaidWrapper");
string oaidStr = jo.Call<string>("getClientId");
oaidText.text += oaidStr;
Debug.Log("getClientId:" + oaidStr);
}
}
public void OnClickGetGUID()
{
oaidText.text += ",getGUID:";
if (Application.platform == RuntimePlatform.Android)
{
jo = new AndroidJavaObject("com.GetOaid.OaidWrapper");
string oaidStr = jo.Call<string>("getGUID");
oaidText.text += oaidStr;
Debug.Log("getGUID:" + oaidStr);
}
}
public void ShowMsg(string msg)
{
megText.text += "\n" + msg;
Debug.Log("msg:" + msg);
}
}
四、总结
在获取和使用 Oaid 时,需要遵守相关的法律法规和隐私政策。不得将 Oaid 用于非法用途,不得泄露用户的隐私信息。
获取安卓手机的 Oaid 对于 Unity 游戏开发者来说具有重要的意义。通过获取 Oaid,开发者可以更好地了解用户行为、优化广告投放效果,并提供个性化的游戏体验。在获取 Oaid 时,需要遵守相关规定,确保获取的 Oaid 准确性,并及时更新 Oaid。希望本文对 Unity 游戏开发者有所帮助。