目录

如何解决使用getBundleInfoForSelf接口获取appinfo中permissions信息为空的问题

问题现象

在开发应用时,需要获取应用包申请权限信息,系统提供了bundleManager.getBundleInfoForSelf接口去获取应用包权限信息,但接口返回后获取的appinfo信息中permissions为空值,是什么原因?

let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION;
bundleManager.getBundleInfoForSelf(this.bundleFlags).then((data) => {
  let permissions = JSON.stringify(data.reqPermissionDetails);
  hilog.info(0x0000, 'test', `permissions: ${permissions}`);
})

背景知识

应用包信息,可以通过bundleManager.getBundleInfoForSelf获取自身的应用包信息,其中参数BundleFlag指定所返回的BundleInfo中所包含的信息。

问题定位

  1. 调用bundleManager.getBundleInfoForSelf接口获取应用包信息需要传入bundleFlags参数,根据传入的bundleFlags参数不同,获取的appinfo信息不同,检查bundleFlags参数是否设置正确。
  2. bundleFlags参数设置可以参考BundleFlag。
  3. 获取应用包申请权限信息需要添加包信息标志GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION,未添加此标志值则无法获取应用包申请权限信息。

分析结论

由于未添加包信息标志GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION,导致无法获取包申请权限信息。

修改建议

添加包信息标志GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION,以获取包申请权限信息。

import { bundleManager } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct GetBundleInfo {
  getInfo() {
    let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
    bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION;
    bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {
      let permissions = JSON.stringify(data.reqPermissionDetails);
      hilog.info(0x0000, 'TAG', 'permissions:' + permissions);
    }).catch((err: BusinessError) => {
      hilog.error(0x0000, 'TAG', err.message);
    });
  }

  build() {
    Column() {
      Button('点击获取包申请权限信息')
        .fontSize(30)
        .onClick(() => {
          this.getInfo();
        });
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center);
  }
}

总结

部分API接口会根据传入的参数不同而返回不同的结果,在使用此类API接口时需要注意传入参数的准确性,从而正确的获取所需要的数据。