有没有HarmonyOS鸿蒙Next三方应用调用一直不变的设备标识符(卸载重装应用还是不变)
有没有HarmonyOS鸿蒙Next三方应用调用一直不变的设备标识符(卸载重装应用还是不变) 有没有三方应用调用一直不变的设备标识符(卸载重装应用还是不变), 且不需要去设置打开开关
一、现有设备标识符的限制
- UDID
- 特性:设备唯一标识符,不随应用卸载或设备重置变化。
- 限制:仅限系统应用及企业定制应用申请权限(ohos.permission.sec.ACCESS_UDID),三方应用无法获取。
- OAID
- 特性:设备级标识符,同一设备上不同应用获取的OAID相同。
- 限制:
- 需要用户授权 ohos.permission.APP_TRACKING_CONSENT 权限。
- 若用户关闭“跨应用关联访问权限”,OAID会变为全0。
- 重置场景:恢复出厂设置、用户手动重置OAID(系统设置中操作)。
- ODID
- 特性:开发者级标识符,同一设备上同一开发者的应用共享相同ODID。
- 限制:
- 当设备恢复出厂设置,或同一开发者的所有应用被卸载后重装时,ODID会重新生成。
- 无需用户授权,但无法保证卸载所有应用后仍不变。
- AAID
- 特性:应用级标识符,每个应用独立。
- 限制:应用卸载后标识符会被清除,重装时生成新的AAID。
二、推荐方案
若必须满足 无需用户操作 且 卸载后不变,可考虑以下组合方式:
- 使用 ODID
- 适用场景:同一设备上安装同一开发者的多个应用,且用户不会卸载所有该开发者的应用。
- 代码示例:
import { deviceInfo } from '@kit.BasicServicesKit';
let odid = deviceInfo.odid; // 获取ODID
- 本地持久化存储
- 在首次安装时生成唯一ID(如UUID),存储到应用沙箱外目录(需申请 ohos.permission.STORE_PERSISTENT_DATA 权限)。
- 限制:用户清除应用数据或恢复出厂设置时,数据会被删除。
三、注意事项
- 隐私合规:设备标识符的使用需严格遵守隐私政策,避免收集敏感信息。
- 替代方案:通过账号体系(如用户登录)绑定设备信息,实现长期唯一性(需用户主动操作)。
更多关于有没有HarmonyOS鸿蒙Next三方应用调用一直不变的设备标识符(卸载重装应用还是不变)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
oaid获取方式,前提得申请 ohos.permission.APP_TRACKING_CONSENT 这个权限
import deviceInfo from '@kit.DeviceInfoKit';
// 获取 OAID
deviceInfo.getOAID((error, oaid) => {
if (error) {
console.error('获取 OAID 失败');
return;
}
console.log('OAID: ' + oaid); // 例如: "12345678-1234-1234-1234-123456789012"
});
希望HarmonyOS能继续优化系统稳定性,减少崩溃和重启的情况。
| 标识类型 | 获取权限 | 唯一性范围 | 持久性特征 |
|---|---|---|---|
| OAID | 需用户授权跟踪权限 | 设备级 | 应用卸载不变化,恢复出厂重置会变化 |
| ODID | 无需特殊权限 | 开发者级(同设备同开发者) | 应用卸载不变化,恢复出厂重置会变化 |
| UDID | 仅系统/企业应用可用 | 设备级 | 永久不变(三方应用无法获取) |
获取OAID前,请确保App已经集成了ads-identifier SDK。
创建子线程,并调用静态的AdvertisingIdClient.getAdvertisingIdInfo(Context context)方法获取OAID信息,代码示例如下:
// 在非主线程获取设备标识信息
private Thread getIdentifierThread = new Thread() {
@Override
public void run() {
try {
AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
if (null != info) {
Log.i("TAG", "info id=" + info.getId() +
", isLimitAdTrackingEnabled=" + info.isLimitAdTrackingEnabled());
}
} catch (IOException e) {
Log.i("TAG", "getAdvertisingIdInfo Exception: " + e.toString());
}
}
};
参考地址
https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/oaid-0000001050783198
OAID是开放匿名设备标识符,非永久性。OAID保护用户隐私,提供个性化广告,支持广告转化分析。OAID具有以下特性:
OAID是设备级标识符,同一台设备上不同的App获取到的OAID值一样。
OAID的获取受应用跟踪开关影响。开关开启时,应用可获取有效OAID;开关关闭时,应用获取全0的OAID。
同一台设备上首个应用开启应用跟踪开关时,会首次生成OAID。
AAID是应用匿名标识符,标识应用实例,只存在于安装期,长度32位。AAID具有更好的隐私属性。
匿名化、无隐私风险:AAID和已有的任何标识符都不关联,并且每个应用只能访问自己的AAID。
同一个设备上,同一个开发者的多个应用,AAID取值不同。
同一个设备上,不同开发者的应用,AAID取值不同。
不同设备上,同一个开发者的应用,AAID取值不同。
不同设备上,不同开发者的应用,AAID取值不同
ODID:开发者匿名设备标识符,它主要用于开放给开发者的设备标识,同一设备上运行的同一个开发者的应用,ODID相同。帮助开发者更好地理解用户在不同应用间的行为,从而提供更个性化的服务和推荐。ODID具有以下特性:
同一设备上运行的同一个开发者的应用,ODID相同。
同一个设备上不同开发者的应用,ODID不同。
不同设备上同一个开发者的应用,ODID不同。
不同设备上不同开发者的应用,ODID不同。
OAID是开放匿名设备标识符,非永久性。OAID保护用户隐私,提供个性化广告,支持广告转化分析。OAID具有以下特性:
- OAID是设备级标识符,同一台设备上不同的App获取到的OAID值一样。
- OAID的获取受应用跟踪开关影响。开关开启时,应用可获取有效OAID;开关关闭时,应用获取全0的OAID。
- 同一台设备上首个应用开启应用跟踪开关时,会首次生成OAID。
AAID是应用匿名标识符,标识应用实例,只存在于安装期,长度32位。AAID具有更好的隐私属性。
- 匿名化、无隐私风险:AAID和已有的任何标识符都不关联,并且每个应用只能访问自己的AAID。
- 同一个设备上,同一个开发者的多个应用,AAID取值不同。
- 同一个设备上,不同开发者的应用,AAID取值不同。
- 不同设备上,同一个开发者的应用,AAID取值不同。
- 不同设备上,不同开发者的应用,AAID取值不同
ODID:开发者匿名设备标识符,它主要用于开放给开发者的设备标识,同一设备上运行的同一个开发者的应用,ODID相同。帮助开发者更好地理解用户在不同应用间的行为,从而提供更个性化的服务和推荐。ODID具有以下特性:
- 同一设备上运行的同一个开发者的应用,ODID相同。
- 同一个设备上不同开发者的应用,ODID不同。
- 不同设备上同一个开发者的应用,ODID不同。
- 不同设备上不同开发者的应用,ODID不同。
ODID值会在以下场景重新生成:
手机恢复出厂设置。
同一设备上同一个开发者(developerId相同)的应用全部卸载后重新安装时。
ODID生成规则:
根据签名信息里developerId解析出的groupId生成,developerId规则为groupId.developerId,若无groupId则取整个developerId作为groupId。
同一设备上运行的同一个开发者(developerId相同)的应用,ODID相同。
同一个设备上不同开发者(developerId不同)的应用,ODID不同。
不同设备上同一个开发者(developerId相同)的应用,ODID不同。
不同设备上不同开发者(developerId不同)的应用,ODID不同。
说明:数据长度为37字节。
示例:1234a567-XXXX-XXXX-XXXX-XXXXXXXXXXXX
如果需要获取设备的唯一标识符,可以使用AAID,获取方法请参阅相关链接;在广告业务场景下,建议使用OAID;对于应用分析,开发者可以使用ODID。
参考链接
HarmonyOS Next中,三方应用可通过deviceId作为设备标识符。该标识符在设备生命周期内保持不变,即使应用卸载重装也不会改变。获取方式为调用系统提供的API接口,具体为getDeviceId方法。此标识符由系统统一管理,确保唯一性和持久性。


