因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android
10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。
近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。(可能存在的问题:部分厂商还没有支持,不过随着更新版本,越来越多的手机已经纳入到兼容范围了)
二、获取方法 1、SDK获取(获取地址)拉到最下面,如下截图
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-v7ax86arm64-v8ax86_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 返加的错误码
补充设备标识获取接口包括补充设备标识状态获取接口、匿名设备标识符获取接口、开发者匿名设备标识符获取接口、应用匿名设备标识符获取接口和关闭接口。
1、补充设备标识状态获取接口
该接口用于获取移动智能终端是否支持补充设备标识体系,确认支持后,可以继续获取所需设备标识符。
2、匿名设备标识符获取接口
3、开发者匿名设备标识符获取接口
4、应用匿名设备标识符获取接口
5、关闭接口
作者:Chelsea0522