获取android手机设备的OAID

一、简介:

因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android
10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。

近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。(可能存在的问题:部分厂商还没有支持,不过随着更新版本,越来越多的手机已经纳入到兼容范围了)

二、获取方法

1、SDK获取

获取地址)拉到最下面,如下截图
在这里插入图片描述

2.调用方法

1、把 miit_mdid_x.x.x.aar 拷贝到项的 libs 目录,并设置依赖,其中x.x.x 代表版本号。

2、将 supplierconfig.json 拷贝到项目 assets 目录下,并修改 边对应内容,特别是需要设置 appid 的部分。需要设置 appid 的部分需要去对应厂商的应用商店 注册自己的 app。

3、设置依赖

implementation files(‘libs/miit_mdid_x.x.x.aar’)

4、混淆设置

-keep class com.bun.miitmdid.core.** {*;}

5、设置 gradle 编译选项,这块可以根据自己对平台的选择进 合 配置(如不需要,跳过即可)

ndk {
abiFilters 'armeabi-v7a','x86','arm64-v8a','x86_64','armeabi'
}
packagingOptions {
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
doNotStrip "*/arm64-v8a/*.so"
doNotStrip “*/x86_64/*.so"
doNotStrip "armeabi.so"
}

6、代码调用

(1)初始化 sdk

在应用的 application 的 onCreate 中方法调用方法:

JLibrary.InitEntry(base);

在这里插入图片描述
(2)获取设备 ID,有两种方法调用,事例代码详见附件 MiitHelper.java(下载的SDK中包含MiitHelper类)

既然方法一不推荐,咱们直接删除,跳过看方法二;

方法一

b1:直接调用,由于安卓 9 以后类加载的限制,所以安卓 9 以后不建议采 用,如需使用,需要做 MdidSdk.InitSdk 和
JLibrary.InitEntry()不能在一个类 里,还要注意包含这两个调用的类不能有依赖关系。 private int
DirectCall(Context cxt){ MdidSdk sdk = new MdidSdk(); return
sdk.InitSdk(cxt,this); }

方法二:

b2:反射调用,它的好处是 android 版本号无关,缺点是调用时间估计会长(经过测试跟直接调用在用时上区别不大。)

 MdidSdkHelper.InitSdk(context, true, new MiitHelper(new MiitHelper.AppIdsUpdater() {
      @Override
      public void OnIdsAvalid(@NonNull String ids) {
       //根方法中,我们如果只需要oaid,则只获取oaid即可
       // String oaid=_supplier.getOAID();
       String oaid = ids;
     }
 }));

(3)初始化 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 反射调用失败

三. IdSupplier 接口说明

补充设备标识获取接口包括补充设备标识状态获取接口、匿名设备标识符获取接口、开发者匿名设备标识符获取接口、应用匿名设备标识符获取接口和关闭接口。

1、补充设备标识状态获取接口
该接口用于获取移动智能终端是否支持补充设备标识体系,确认支持后,可以继续获取所需设备标识符。
public boolean isSupported()参数 返回 说明无 boolean:是否支持补充设备标识符获取 true 为支持,false 为不支持
2、匿名设备标识符获取接口
在这里插入图片描述
3、开发者匿名设备标识符获取接口
String getVAID()参数 返回 说明无 String:返回开发者匿名设备 开发者匿名设备标识符最长标识符或空字符串 64 位,返回空字符串表示不支持,异常状态包括网络异常、appid 异常、应用异常等
在这里插入图片描述
4、应用匿名设备标识符获取接口
在这里插入图片描述

5、关闭接口
在这里插入图片描述

四. 使用建议
  • 1、调用 MdidSdk 的 InitSdk 后,先检查返回值,如果返回值是不支持的设备或厂商,监听器也不会触发,如果是加载配置文件失败,联系我们的客服。
  • 2、VAID/AAID 在初次调用时生成,生成需要访问网络,请确保网络通畅并可 访问公网。
  • 3、同一设备中存有多个同一开发者应用,若需在单个应用卸载时保证 VAID不被重置,需在应用被卸载前,已有另外同一开发者 ID 的应用也读取过 VAID, 否则认定该开发者无需使用 VAID,值将被重置。
  • 4、部分厂商,若应用未在其开发者平台后台上架,则认定未非法应用,无法 生成 VAID,手机 LOG 中将会有相关异常值输出。
  • 5、在用户手机处于弱网、无法访问公网或非法应用情形下频繁调用 VAID 和 AAID 读取接口,终端会累计其调用次数,并限时限制其读取。
  • 6、由于返回值可能为 null,使用逻辑判断中建议做判空处理。
  • 7、若有表一中的异常出现,会有相关 Log 打出。
  • 8、INIT_ERROR_DEVICE_NOSUPPORT 和 INIT_HELPER_CALL_ERROR 这两个暂时不会走回调,后续会调整。
发布了49 篇原创文章 · 获赞 46 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/mingtiannihao0522/article/details/104630967