androidQ(api29)出来后,IMEI等等这些个设备唯一号都没法获取了,虽然androidID还能用但是这货可以重置甚至可能是个null,而甲方爸爸又偏偏指定要可靠的设备唯一号,只好硬着头皮在百度上搜,原来移动安全联盟(MSA)早已经预谋好了,研发出的SDK可以获取到叫做OAID的匿名设备唯一号,那么赶紧跟着这些大佬整齐划一。
如果想要了解OAID的可以去百度,或者在vivo开放平台上了解一下:移动智能终端补充设备标识服务
公司是要在自己的SDK中集成OAID的获取,所以我把OAID的SDK的arr包给拆了,我用的是这个版本miit_mdid_1.0.10.aar,用压缩文件打开后是这样的:
把其中的classes.jar和jni中的文件都考到了项目的libs文件中,然后assets中的文件A3AEECD8.dex也考到了项目的assets文件中,这里我把classes.jar改了个名字miit_mdid_1.0.10.jar。
另外下载的压缩包中还有一个supplierconfig.json文件,也放在assets中。
官方还提供了了一个MiitHelper.java文件以供参考,我抽出来放在demo中了:
public class MainActivity extends AppCompatActivity {
private TextView tv_msg, tv_timecost, tv_oaid;
private long timeb, timee;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JLibrary.InitEntry(MainActivity.this);//初始化
tv_msg = findViewById(R.id.tv_msg);
tv_timecost = findViewById(R.id.tv_timecost);
tv_oaid = findViewById(R.id.tv_oaid);
timeb = System.currentTimeMillis();
int errorCode = MdidSdkHelper.InitSdk(MainActivity.this, true, new IIdentifierListener() {
@Override
public void OnSupport(boolean b, IdSupplier idSupplier) {
if (idSupplier == null) {
return;
}
tv_oaid.setText("OAID=" + idSupplier.getOAID());
idSupplier.shutDown();
timee = System.currentTimeMillis();
tv_timecost.setText("耗时:" + (timee - timeb) + "毫秒");
}
});
if (errorCode == ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT) {
tv_msg.setText("获取OAID:" + "不支持的设备");
} else if (errorCode == ErrorCode.INIT_ERROR_LOAD_CONFIGFILE) {
tv_msg.setText("获取OAID:" + "加载配置文件出错");
} else if (errorCode == ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT) {
tv_msg.setText("获取OAID:" + "不支持的设备厂商");
} else if (errorCode == ErrorCode.INIT_ERROR_RESULT_DELAY) {
tv_msg.setText("获取OAID:" + "获取接口是异步的,结果会在回调中返回,回调执行的回调可能在工作线程");
} else if (errorCode == ErrorCode.INIT_HELPER_CALL_ERROR) {
tv_msg.setText("获取OAID:" + "反射调用出错");
} else {
tv_msg.setText("获取OAID:" + "获取成功");
}
}
}
最后在模拟器上运行的结果是:
在手机上运行的结果是:
其中因为在主线程中去调用了MdidSdkHelper.InitSdk方法,所以会报这个错误,另外在AS的模拟器和雷电模拟器中,都没能获取到OAID。