Android_CN_OAID icon indicating copy to clipboard operation
Android_CN_OAID copied to clipboard

OAID 有时能获取到,有时获取不到?

Open stevenwsg opened this issue 4 years ago • 7 comments
trafficstars

企业微信截图_e5e679e6-0807-4ba2-97d9-f819474e4524

数据反馈,同一个用户, 同一款设备。有时候上报oaid,有时候不上报。看这个上报应该是初始化完成了。

什么原因会导致这种情况啊?

机型是 VIVO V1809A, 用的版本是 4.0.1

stevenwsg avatar Jul 12 '21 06:07 stevenwsg

我看oaid也只有DeviceID.register(this);赋值,在没有其他地方赋值了,其他地方都是读取。

stevenwsg avatar Jul 12 '21 06:07 stevenwsg

我看oaid也只有DeviceID.register(this);赋值,在没有其他地方赋值了,其他地方都是读取。

DeviceID.register(this);这种用法,建议在Application里预先获取。不然就每次都调用DeviceID.getOAID(this, new IGetter() {..});适时获取。由于DeviceID.getOAID(this, new IGetter() {..});是异步的,你的这种为空的情况可能是DeviceID.register(this);里调用getOAID的时候还在获取OAID的过程中还没等得到结果就已经开始上报数据了

liyujiang-gzu avatar Jul 12 '21 06:07 liyujiang-gzu

我看oaid也只有DeviceID.register(this);赋值,在没有其他地方赋值了,其他地方都是读取。

DeviceID.register(this);这种用法,建议在Application里预先获取。不然就每次都调用DeviceID.getOAID(this, new IGetter() {..});适时获取。由于DeviceID.getOAID(this, new IGetter() {..});是异步的,你的这种为空的情况可能是DeviceID.register(this);里调用getOAID的时候还在获取OAID的过程中还没等得到结果就已经开始上报数据了

目前DeviceID.register(this);是在Application的oncreate中预期的。 获取oaid具体的时间最长会有多长时间啊? 数据反馈这个埋点上报的时机至少是APP启动了一定时间的

stevenwsg avatar Jul 12 '21 07:07 stevenwsg

我看oaid也只有DeviceID.register(this);赋值,在没有其他地方赋值了,其他地方都是读取。

DeviceID.register(this);这种用法,建议在Application里预先获取。不然就每次都调用DeviceID.getOAID(this, new IGetter() {..});适时获取。由于DeviceID.getOAID(this, new IGetter() {..});是异步的,你的这种为空的情况可能是DeviceID.register(this);里调用getOAID的时候还在获取OAID的过程中还没等得到结果就已经开始上报数据了

目前DeviceID.register(this);是在Application的oncreate中预期的。 获取oaid具体的时间最长会有多长时间啊? 数据反馈这个埋点上报的时机至少是APP启动了一定时间的

OAID的获取时长有点无法预计,不同的厂商和品牌实现方式不一样。为了保证OIAD不为空,也许你可以参照DeviceID.register(this);里的写法,等到getOAID得到回调onOAIDGetComplete或者onOAIDGetError后再上报数据:

       String uniqueID = getUniqueID(application);
        if (!TextUtils.isEmpty(uniqueID)) {
            instance.clientId = uniqueID;
            OAIDLog.print("Client id is IMEI/MEID: " + instance.clientId);
            return;
        }
        getOAID(application, this);

    @Override
    public void onOAIDGetComplete(String result) {
        if (result == null) {
            result = "";
        }
        clientId = result;
        oaid = result;
        OAIDLog.print("Client id is OAID/AAID: " + clientId);
    }

    @Override
    public void onOAIDGetError(Exception error) {
        String id = DeviceID.getWidevineID();
        if (!TextUtils.isEmpty(id)) {
            clientId = id;
            OAIDLog.print("Client id is WidevineID: " + clientId);
            return;
        }
        id = getAndroidID(application);
        if (!TextUtils.isEmpty(id)) {
            clientId = id;
            OAIDLog.print("Client id is AndroidID: " + clientId);
            return;
        }
        clientId = getGUID(application);
        OAIDLog.print("Client id is GUID: " + clientId);
    }

liyujiang-gzu avatar Jul 12 '21 07:07 liyujiang-gzu

没注意onOAIDGetComplete(String result)result还可能为空,除了上面说的可能是getOAID还没得到回调就开始上报数据了,不知道会不会是本身获取OAID就是空的?说不定还真是有时候onOAIDGetComplete拿到的OAID就是空的

liyujiang-gzu avatar Jul 12 '21 07:07 liyujiang-gzu

我看oaid也只有DeviceID.register(this);赋值,在没有其他地方赋值了,其他地方都是读取。

DeviceID.register(this);这种用法,建议在Application里预先获取。不然就每次都调用DeviceID.getOAID(this, new IGetter() {..});适时获取。由于DeviceID.getOAID(this, new IGetter() {..});是异步的,你的这种为空的情况可能是DeviceID.register(this);里调用getOAID的时候还在获取OAID的过程中还没等得到结果就已经开始上报数据了

目前DeviceID.register(this);是在Application的oncreate中预期的。 获取oaid具体的时间最长会有多长时间啊? 数据反馈这个埋点上报的时机至少是APP启动了一定时间的

OAID的获取时长有点无法预计,不同的厂商和品牌实现方式不一样。为了保证OIAD不为空,也许你可以参照DeviceID.register(this);里的写法,等到getOAID得到回调onOAIDGetComplete或者onOAIDGetError后再上报数据:

       String uniqueID = getUniqueID(application);
        if (!TextUtils.isEmpty(uniqueID)) {
            instance.clientId = uniqueID;
            OAIDLog.print("Client id is IMEI/MEID: " + instance.clientId);
            return;
        }
        getOAID(application, this);

    @Override
    public void onOAIDGetComplete(String result) {
        if (result == null) {
            result = "";
        }
        clientId = result;
        oaid = result;
        OAIDLog.print("Client id is OAID/AAID: " + clientId);
    }

    @Override
    public void onOAIDGetError(Exception error) {
        String id = DeviceID.getWidevineID();
        if (!TextUtils.isEmpty(id)) {
            clientId = id;
            OAIDLog.print("Client id is WidevineID: " + clientId);
            return;
        }
        id = getAndroidID(application);
        if (!TextUtils.isEmpty(id)) {
            clientId = id;
            OAIDLog.print("Client id is AndroidID: " + clientId);
            return;
        }
        clientId = getGUID(application);
        OAIDLog.print("Client id is GUID: " + clientId);
    }

嗯嗯 谢谢我试试~

stevenwsg avatar Jul 12 '21 08:07 stevenwsg

没注意onOAIDGetComplete(String result)result还可能为空,除了上面说的可能是getOAID还没得到回调就开始上报数据了,不知道会不会是本身获取OAID就是空的?说不定还真是有时候onOAIDGetComplete拿到的OAID就是空的

嗯嗯 就是存在可能同一个设备,有时能获取到oaid,有时获取不到。 有这种概率是吧

stevenwsg avatar Jul 12 '21 08:07 stevenwsg

没注意onOAIDGetComplete(String result)result还可能为空,除了上面说的可能是getOAID还没得到回调就开始上报数据了,不知道会不会是本身获取OAID就是空的?说不定还真是有时候onOAIDGetComplete拿到的OAID就是空的

嗯嗯 就是存在可能同一个设备,有时能获取到oaid,有时获取不到。 有这种概率是吧

自4.2.6版本开始已暴露一个回调接口IRegisterCallback,埋点上报可以改到这个回调接口里。

liyujiang-gzu avatar Nov 12 '23 06:11 liyujiang-gzu