# 如何解决获取OAID异常的问题

#### 问题现象

获取OAID会遇到以下常见的问题，应该如何解决？

*   调用identifier.getOAID获取到的OAID值是00000000-0000-0000-0000-000000000000，且没有授权弹窗。
*   调用identifier.getOAID接口报错。

#### 背景知识

OAID是一种非永久性设备标识符，基于开放匿名设备标识符，可在保护用户个人数据隐私安全的前提下，向用户提供个性化广告，同时三方监测平台也可以向广告主提供转化归因分析。OAID的获取方式参考identifier.getOAID。

#### 问题定位

1.  应用是否正确的配置了ohos.permission.APP\_TRACKING\_CONSENT权限。
2.  应用是否开启“跨应用关联访问权限”。
3.  应用授权弹窗是否点击确认。

#### 分析结论

针对identifier.getOAID获取异常的问题，主要有以下几种可能的原因：

1.  应用未在当前模块的module.json5文件中配置ohos.permission.APP\_TRACKING\_CONSENT权限。
2.  应用配置了ohos.permission.APP\_TRACKING\_CONSENT权限，但是“跨应用关联访问权限”设置为“禁止”。
3.  应用配置了ohos.permission.APP\_TRACKING\_CONSENT权限，但在弹窗提示用户授权时，用户未选择手动授权。

#### 修改建议

1.  配置相关权限：
    
    在应用的module.json5文件中添加ohos.permission.APP\_TRACKING\_CONSENT权限配置。确保该权限被正确声明，以便应用能够请求获取OAID的权限。该权限为user\_grant权限，当申请的权限为user\_grant权限时，reason，abilities标签必填，具体申请方式请参见声明权限。
    
2.  跨应用关联访问权限：
    
    可以通过在应用内提供明确的指引或说明，引导用户前往设置-隐私安全-跨应用关联，手动开启允许“跨应用关联访问权限”，告知用户开启该权限的必要性和用途，以提高用户的授权意愿。比如通过代码跳转设置-隐私二级页面。
    
3.  用户手动授权：
    
    调用requestPermissionsFromUser接口弹窗，提示并引导用户允许对应权限。
    
    ```
    import { BusinessError } from '@kit.BasicServicesKit';
    import { abilityAccessCtrl, common, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { identifier } from '@kit.AdsKit';
    
    @Entry
    @Component
    struct Index {
      context = this.getUIContext().getHostContext() as common.UIAbilityContext;
      @State oaid: string = '';
    
      jumpToSetting() {
        let want: Want = {
          bundleName: 'com.huawei.hmos.settings',
          abilityName: 'com.huawei.hmos.settings.MainAbility',
          uri: 'privacy_settings',
          parameters: {
            // 传对应应用的包名
            pushParams: 'com.example.myapplication'
          }
        };
        this.context.startAbility(want);
      }
    
      requestOAIDTrackingConsentPermissions(context: common.Context): void {
        // 进入页面时，向用户请求授权广告跨应用关联访问权限
        const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
        try {
          atManager.requestPermissionsFromUser(context, ['ohos.permission.APP_TRACKING_CONSENT']).then((data) => {
            if (data.authResults[0] === 0) {
              hilog.info(0x0000, 'testTag', '%{public}s', 'succeeded in requesting permission');
              identifier.getOAID((err: BusinessError, data: string) => {
                if (err.code) {
                  hilog.error(0x0000, 'testTag', '%{public}s', `get oaid failed, error: ${err.code} ${err.message}`);
                } else {
                  this.oaid = data;
                  hilog.info(0x0000, 'testTag', '%{public}s', `succeeded in getting oaid by callback , oaid: ${this.oaid}`);
                }
              });
            } else {
              hilog.error(0x0000, 'testTag', '%{public}s', 'user rejected');
            }
          }).catch((err: BusinessError) => {
            hilog.error(0x0000, 'testTag', '%{public}s', `request permission failed, error: ${err.code} ${err.message}`);
          });
        } catch (err) {
          hilog.error(0x0000, 'testTag', '%{public}s', `catch err->${err.code}, ${err.message}`);
        }
      }
    
      build() {
        Column({ space: 20 }) {
          Button('跳转设置')
            .onClick(() => {
              this.jumpToSetting();
            });
          Button('获取oaid')
            .onClick(() => {
              this.requestOAIDTrackingConsentPermissions(this.context);
            });
          Text(this.oaid);
        }
        .height('100%')
        .width('100%');
      }
    }
    ```
    

#### 常见FAQ

Q：如何分辨接口异常是权限问题导致的？

A：一些常见的Kit（比如推送服务、地图服务等）需要在AppGallery Connect网站上先开通服务并完成手动签名，或者在项目中需要配置相应的权限（可参考申请应用权限），因此需要先确认集成的Kit是否需要配置这些权限，在开发之前应该做好相应的开发准备，确保不会因为权限问题阻塞开发。