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 及以上
vivoFuntouchOS 9 及以上
华为全版本
OPPOColor OS 7.0 及以上(10月份正式支持)
LenovoZUI 11.4 及以上(10月中旬正式支持)
华硕android Q(10月份会正式支持)
魅族10月份将支持
三星10月份将支持
中兴10月份将支持
努比亚10月份将支持

术语和定义:

英文缩写中文名称英文全称长度
IMEI国际移动设备识别码International Mobile Equipment Identity15~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_NOSUPPORT1008611不支持的厂商
INIT_ERROR_DEVICE_NOSUPPORT1008612不支持的设备
INIT_ERROR_LOAD_CONFIGFILE1008613加载配置文件出错
INIT_ERROR_RESULT_DELAY1008614信息将会延迟返回,获取数据可能在异步线程,取决于设备
INIT_HELPER_CALL_ERROR1008615反射调用出错

代码实现

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的主要内容,如果未能解决你的问题,请参考以下文章

Android获取OAID

安卓获取OAID方法

Android 获取唯一Id

保护用户隐私安全,基于OAID进行个性化广告推荐

设备标识符oaid可以直接重置关闭,如何获取设备标识?

Android 使用两个不同的代码片段获取当前位置 NULL