文档管理中心

超级隐私模式下,应用权限申请异常

问题现象

在超级隐私模式下,应用申请位置、相机和麦克风权限,结果无响应或提示未开启/无权限,未能给出有效引导。

背景知识

  • 开启超级隐私模式后,应用将无法获取手机的麦克风、摄像头、位置数据。此时,即使应用已经被授权相关权限,也不能完成访问目标的操作。应用需要检测到这种状态,并通过适当的方式来提醒用户并辅助开启对应的全局开关。详情可见功能被禁用处理方式。
  • 以下为判断各全局开关是否打开的方法:
    • 位置:isLocationEnabled判断位置服务是否已经使能,返回true表示位置信息开关已开启,false表示位置信息开关已关闭。
    • 相机:isCameraMuted查询相机当前的禁用状态(禁用/未禁用),返回true表示相机被禁用,false表示相机未被禁用。
    • 麦克风:isMicrophoneMute查询麦克风当前静音状态,返回true表示麦克风被静音,false表示麦克风未被静音。
  • 提醒用户重新开启全局开关,则需要调用requestGlobalSwitch()方法,之后才能继续调用所需的接口。

问题定位

  1. 点击相应需要申请权限的功能后,未拉起权限弹窗,而是未响应或提示未开启/无权限/失败等内容。
  2. 检查设备的状态栏,有盾牌外形锁孔图标,代表开启了超级隐私模式。

  3. 查看权限申请时的代码,检查是否存在校验全局开关的方法,以及是否调用了requestGlobalSwitch()方法提醒用户打开。

分析结论

设备开启了超级隐私模式,应用未对此情况做检测,也未能通过适当的方式来提醒用户开启全局开关。

修改建议

添加校验全局开关是否开启的逻辑,调用requestGlobalSwitch()方法提醒用户重新开启。

具体开发可以参考如下代码,更详细代码参考功能被禁用处理方式文档的示例代码。

import { abilityAccessCtrl, common } from '@kit.AbilityKit';
import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct LocationTogglePage {
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;

  // 以位置权限为例
  isLocationToggle() {
    let atManager = abilityAccessCtrl.createAtManager();
    // 判断位置服务是否开启
    let isLocationEnabled = geoLocationManager.isLocationEnabled();
    if (!isLocationEnabled) {
      // 拉起弹窗提醒用户关闭超级隐私模式
      atManager.requestGlobalSwitch(this.context, abilityAccessCtrl.SwitchType.LOCATION).then((data: boolean) => {
        if (data) {
          // 已关闭,获取位置权限
        } else {
          // 依旧未关闭
        }
      }).catch((err: BusinessError) => {
        console.error(`requestGlobalSwitch failed, code is ${err.code}, message is ${err.message}`);
      });
    }
  }
  build() {
    Column() {
      Button('位置开关')
        .onClick(() => {
          this.isLocationToggle();
        })
        .margin({top: 40})
    }
    .height('100%')
    .width('100%')
  }
}
在 FAQ 中进行搜索
请输入您想要搜索的关键词