获取OAID

 androidQ(api29)出来后,IMEI等等这些个设备唯一号都没法获取了,虽然androidID还能用但是这货可以重置甚至可能是个null,而甲方爸爸又偏偏指定要可靠的设备唯一号,只好硬着头皮在百度上搜,原来移动安全联盟(MSA)早已经预谋好了,研发出的SDK可以获取到叫做OAID的匿名设备唯一号,那么赶紧跟着这些大佬整齐划一。

 如果想要了解OAID的可以去百度,或者在vivo开放平台上了解一下:移动智能终端补充设备标识服务

 公司是要在自己的SDK中集成OAID的获取,所以我把OAID的SDK的arr包给拆了,我用的是这个版本miit_mdid_1.0.10.aar,用压缩文件打开后是这样的:

miit_mdid_1.0.10.aar解压缩后的文件

 把其中的classes.jarjni中的文件都考到了项目的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。

你可能感兴趣的:(获取OAID)