在HarmonyOS中 ,用户获取相册权限时,点击拒绝后问题?

在HarmonyOS中 ,用户获取相册权限时,点击拒绝后,用户再次点击怎么获取当前权限的状态
现在就是用以下方法实现,但是用户拒绝后,再次点击上传没有反应

private async openGallery() { 
  let context = getContext(this) as common.UIAbilityContext; 
  let atManager = abilityAccessCtrl.createAtManager(); 
  let info = await bundleManager.getBundleInfoForSelf(0); 
  LogUtil.error(this.TAG,'用户权限信息: ',JSON.stringify(info)) 
  if (info && info.appInfo) { 
    let result = atManager.verifyAccessTokenSync(info.appInfo.accessTokenId, "ohos.permission.READ_MEDIA"); 
    if (abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED == result) { 
      console.log("has permission") 
    } 
  } else { 
    atManager.requestPermissionsFromUser(context, ["ohos.permission.READ_MEDIA"], (error, result) => { 
      if (result) { 
        console.log("result: " + JSON.stringify(result)); 
        if (result.authResults[0] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { 
          // 用户授予权限 
          // 打开相册 
          this.openGalleryInternal(); 
        } else { 
          // 用户拒绝权限 
          LogUtil.error(this.TAG, '用户拒绝授权') 
        } 
      } else { 
        LogUtil.error(this.TAG, '请求异常-',JSON.stringify(error)) 
      } 
    }); 
  } 
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 616
avatarAI BotBETA
在HarmonyOS中,当用户首次拒绝相册权限后,再次尝试获取权限时,需要确保你的代码能够正确处理权限的重新请求。你的当前代码在用户拒绝权限后,没有提供再次请求权限的逻辑。为了解决这个问题,你需要在用户拒绝权限后,仍然提供一个途径来重新请求权限。

以下是一个修改后的示例,展示了如何在用户拒绝权限后再次请求权限:

private async openGallery() {
let context = getContext(this) as common.UIAbilityContext;
let atManager = abilityAccessCtrl.createAtManager();
let info = await bundleManager.getBundleInfoForSelf(0);

if (info && info.appInfo) {

let result = atManager.verifyAccessTokenSync(info.appInfo.accessTokenId, "ohos.permission.READ_MEDIA");
if (abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED == result) {
  console.log("has permission");
  // 打开相册
  this.openGalleryInternal();
} else {
  // 用户未授予权限,请求权限
  this.requestPermission();
}

} else {

// 无法获取应用信息,请求权限
this.requestPermission();

}
}

private requestPermission() {
let context = getContext(this) as common.UIAbilityContext;
let atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(context, ["ohos.permission.READ_MEDIA"], (error, result) => {

if (result) {
  console.log("result: " + JSON.stringify(result));
  if (result.authResults[0] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
    // 用户授予权限
    // 打开相册
    this.openGalleryInternal();
  } else {
    // 用户再次拒绝权限
    LogUtil.error(this.TAG, '用户拒绝授权');
    // 这里可以添加额外的逻辑,比如提示用户权限的重要性或者跳转到设置页面
  }
} else {
  LogUtil.error(this.TAG, '请求异常-', JSON.stringify(error));
}

});
}

private openGalleryInternal() {
// 打开相册的具体实现
console.log("Opening gallery...");
}


在这个修改后的示例中,`openGallery` 方法首先检查当前是否有相册权限。如果没有权限,它会调用 `requestPermission` 方法来请求权限。`requestPermission` 方法中包含了请求权限的逻辑,并在用户授予或拒绝权限后执行相应的操作。如果用户拒绝权限,你可以在 `else` 块中添加额外的逻辑来提示用户或者引导用户去设置页面授予权限。
1 个回答

具体约束与限制:
每次执行需要目标权限的操作时,应用都必须检查自己是否已经具有该权限。
如需检查用户是否已向您的应用授予特定权限,可以使用checkAccessToken()函数,此方法会返回PERMISSION_GRANTED或PERMISSION_DENIED。具体示例可参考下文。
每次访问受目标权限保护的接口之前,都需要使用requestPermissionsFromUser()接口请求相应的权限。
用户可能在动态授予权限后通过系统设置来取消应用的权限,因此不能将之前授予的授权状态持久化。
user_grant权限授权要基于用户可知可控的原则,需要应用在运行时主动调用系统动态申请权限的接口,系统弹框由用户授权,用户结合应用运行场景的上下文,识别出应用申请相应敏感权限的合理性,从而做出正确的选择。
系统不鼓励频繁弹窗打扰用户,如果用户拒绝授权,二次申请授权已经提供了接口,可以跳转到设置页面引导用户授权,
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...
相关参考指南链接:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题