Android获取OAID
Posted 汤米粥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android获取OAID相关的知识,希望对你有一定的参考价值。
写在最前面
看评论有好些朋友遇到了一些我没遇到的问题,而且看官方文档也已经更新,想着这些问题官方是不是已经优化解决了,就按着最新的文档把项目重新捋了一遍。基于《移动智能终端补充设备标识体系统一调用SDK开发者说明文档v1.10》和miit_mdid_1.0.10.aar 更新了一下项目。项目地址:GitHub https://github.com/haoguibao/OaidDemo/tree/master
文档和sdk我放网盘了。链接: https://pan.baidu.com/s/1bAoi8h2s2DTO1vWKPdkmQg 提取码: mia1 当然了官网上也能找到最新的文档和sdk来下载(官网地址:http://www.msa-alliance.cn/ )。另外编译了一个可运行的OaidDemo.apk,也在上面网盘里面放着,可以直接安装一下运行看行不行。
把之前项目中获取IMEI和权限等代码删除了,仅保留了获取OAID的方法,仅供参考。
现在是腊月廿七,再有几天就要过年了,提前祝大家新年快乐,身体健康,发财不发福!(* ̄︶ ̄)
****************************************************以下是原文********************************************************
写在前面
前段时间在登录vivo开放平台时,看见官方发公告了,以后逐渐要禁止获取IMEI,使用OAID(匿名设备标识符)来替代IMEI在app的作用(另外我们也可以获取VAID和AAID,下文会提到),所以找到官方文档,写个获取OAID的Demo,权当为以后替换IMEI做个铺垫。
说明文档
下面的内容基于《移动智能终端补充设备标识体系统一调用SDK开发者说明文档v1.9》来展开,后期官方文档也会持续更改,如需获取最新文档或sdk,请关注移动安全联盟MSA官网:http://www.msa-alliance.cn/
SDK支持的终端范围:(具体支持时间得看相应厂商的正式公告)
厂商 | 版本 |
小米 | MIUI10.2 及以上 |
vivo | FuntouchOS 9 及以上 |
华为 | 全版本 |
OPPO | Color OS 7.0 及以上(10月份正式支持) |
Lenovo | ZUI 11.4 及以上(10月中旬正式支持) |
华硕 | android Q(10月份会正式支持) |
魅族 | 10月份将支持 |
三星 | 10月份将支持 |
中兴 | 10月份将支持 |
努比亚 | 10月份将支持 |
术语和定义:
英文缩写 | 中文名称 | 英文全称 | 长度 |
IMEI | 国际移动设备识别码 | International Mobile Equipment Identity | 15~17位 |
UDID | 设备唯一标识符 | Unique Device Identifier | 最长64位 |
OAID | 匿名设备标识符 | Open Anonymous Device Identifier | 最长64位 |
VAID | 开发者匿名设备标识符 | Vender Anonymous Device Identifier | 最长64位 |
AAID | 应用匿名设备标识符 | Application Anonymous Device Identifier | 最长64位 |
SDK使用过程:
目前(截止2019-9-29)最新sdk链接: https://pan.baidu.com/s/1C9k9ntev300-z7FzaZfkYw 提取码: 6qv2
1、把 miit_mdid_x.x.x.aar 拷贝到项的 libs 目录,并设置依赖,其中 x.x.x代表版本号。
2、将 supplierconfig.json 拷贝到项目 assets 目录下。(暂时不用修改,只需原样放到assets目录下即可,这个是给未来做准备的。如果想要使用VAID,可修改里边对应内容,特别是需要设置 appid 的部分,要去对应厂商的应用商店里注册自己的 app,来获取对应appid。)
3、设置依赖
implementation files('libs/miit_mdid_x.x.x.aar')
4、设置混淆(不需混淆的可忽略)
-keep class com.bun.miitmdid.core.** {*;}
5、设置gradle编译选项。(自己合理配置即可,大家在项目中大都已经配置过)
6、代码调用
a、初始化SDK
在应用的 application 的 attachBaseContext方法中调用方法: JLibrary.InitEntry(base);
b、获取设备ID,详见OaidDemo中的MiitHelper.java 。(可以直接把MiitHelper.java类复制到自己的项目中)
/*
* 通过反射调用,解决android 9以后的类加载升级,导至找不到so中的方法
*
* */
private int CallFromReflect(Context cxt) {
return MdidSdkHelper.InitSdk(cxt, true, this);
}
c、初始化sdk时可能返回的错误码
错误信息 | 值 | 说明 |
INIT_ERROR_MANUFACTURER_NOSUPPORT | 1008611 | 不支持的厂商 |
INIT_ERROR_DEVICE_NOSUPPORT | 1008612 | 不支持的设备 |
INIT_ERROR_LOAD_CONFIGFILE | 1008613 | 加载配置文件出错 |
INIT_ERROR_RESULT_DELAY | 1008614 | 信息将会延迟返回,获取数据可能在异步线程,取决于设备 |
INIT_HELPER_CALL_ERROR | 1008615 | 反射调用出错 |
代码实现
Demo已经上传GitHub,链接:https://github.com/haoguibao/OaidDemo/tree/master
具体的获取调用代码在DevicesUtil.java类里面,整合了获取OAID,IMEI,AndroidId和UUID等方法。
获取的标识符优先级为oaid > IMEI > AndroidId
/**
* 获取唯一标识idfa
* <p>
* 支持获取oaid的,优先获取oaid,
* 其次是IMEI,
* 如果没有得到IMEI权限,则获取AndroidId
*
* @param context
* @return
*/
public static String getIdfa(Context context) {
String idfa;
if (MyApplication.isSupportOaid()) {
idfa = MyApplication.getOaid();
} else {
idfa = getUniqueId(context);
}
return idfa;
}
写了半天,发现就跟抄了一遍文档一样(捂脸),权当是篇笔记吧。
以上是关于Android获取OAID的主要内容,如果未能解决你的问题,请参考以下文章