权限访问控制管理,如何防止用户未正常申请权限,造成应用使用过程中权限报错。

权限访问控制管理

HarmonyOS
2024-05-22 22:36:36
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
JKings

应用申请某项权限时可能存在被拒绝情况,当再次打开应用不会再次申请该权限,需要用户前往“设置-隐私-权限管理”开启相关权限。这篇文档主要介绍如何防止用户未正常申请权限,造成应用使用过程中权限报错。

1. 

在使用权限前,检测权限。

首先,我们需要判断自己是否拥有权限。判断时间点为执行需要权限的对应操作前。如我们在获取媒体库文件时,需要判断是否拥有ohos.permission.READ_MEDIA权限。我们可以调用atManager.verifyAccessTokenSync()方法检查授权状态,返回的结果为GrantStatus中两个常量:PERMISSION_GRANTED(已授权)和PERMISSION_DENIED(未授权)。verifyAccessTokenSync()方法需要传入两个参数,分别是应用的身份标识tokenId和检验权限permissionName。身份标识tokenId在系统应用可以通过bundleManager.getApplicationInfo获取,普通应用可以通过bundleManager.getBundleInfoForSelf获取。

import bundleManager from '@ohos.bundle.bundleManager'; 
import abilityAccessCtrl,{Permissions} from '@ohos.abilityAccessCtrl'; 
export class RequestModel { 
     * 同步检查校验应用是否被授予权限 
     */ 
    async checkAccessTokenSync(bundleName:Permissions):Promise<boolean>{ 
  let atManager = abilityAccessCtrl.createAtManager(); 
        let tokenId = await this.getTokenId() 
        let data = atManager.verifyAccessTokenSync(tokenId,bundleName) 
        if(data === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { 
            return true 
        } else  { 
            return false 
        } 
    } 
   
    /** 
     * 获取应用的身份标识 
     * 系统应用可以通过bundleManager.getApplicationInfo获取,普通应用可以通过bundleManager.getBundleInfoForSelf获取 
     */ 
    async getTokenId() { 
        let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION; 
        let data = await bundleManager.getBundleInfoForSelf(bundleFlags) 
        return data.appInfo.accessTokenId 
    } 
}

2.已授权的情况下,执行你的原有操作。

当已授权时,就可以执行你原有的操作了。代码如下:

let isRequestPermissions = await this.requestModel.checkAccessTokenSync('ohos.permission.READ_MEDIA') 
if(!isRequestPermissions) { 
  //检查是否申请文件读取权限,未申请要求用户去申请 
  this.dialogController.open() 
}

3.未授权的情况下,申请权限或打开系统权限管理

普通应用情况下,如果应用未获得授权,需要用户前往“设置-隐私-权限管理”开启相关权限。示例代码如下:

startSystemAbility() { 
  var want = { 
    "bundleName" : "com.ohos.permissionmanager", 
    "abilityName" : "com.ohos.permissionmanager.MainAbility" 
  } 
  var options = { 
    windowMode:0 
  } 
  let context = getContext(this) as any 
  context.startAbility(want,options,(error)=> { 
    console.log("error.code ="+error.code); 
  }) 
}

系统应用情况下,如果应用未获得授权,我们就需要向用户申请授权。可以调用

grantUserGrantedPermission()方法来请求授权。代码如下:

async grantUserPermissions(bundleName:Permissions) { 
  let permissionFlags = 1; 
  let tokenId = await this.getTokenId() 
  let permission =  this.atManager.grantUserGrantedPermission(tokenId,bundleName,permissionFlags) 
 
  return permission.then(()=> { 
    console.log('grantUserGrantedPermission success'); 
    return true 
  }).catch((err) => { 
    console.log(`grantUserGrantedPermission fail, err->${JSON.stringify(err)}`); 
    return false 
  }) 
}

4.user_grant权限预授权

应用在申请user_grant类型的权限默认未授权,需要通过拉起弹框由用户确认是否授予该权限。对于一些预制应用,不希望出现弹窗申请user_grant类型的权限,例如系统相机应用需要使用麦克风 ohos.permission.MICROPHONE等权限,需要对麦克风等权限进行预授权,可以通过预授权的方式完成user_grant类型权限的授权。预置配置文件在设备上的路径为/system/etc/app/install_list_permission.json,设备开机启动时会读取该配置文件,在应用安装会对在文件中配置的user_grant类型权限授权。预授权配置文件字段内容包括bundleName、app_signature和permissions。

  • bundleName字段配置为应用的Bundle名称。
  • app_signature字段配置为应用的指纹信息。指纹信息的配置参见应用特权配置指南
  • permissions字段中name配置为需要预授权的user_grant类型的权限名;permissions字段中userCancellable表示为用户是否能够取消该预授权,配置为true,表示支持用户取消授权,为false则表示不支持用户取消授权。
[ 
// ... 
  { 
    "bundleName": "com.example.myapplication", // Bundle名称 
    "app_signature": ["****"], // 指纹信息 
    "permissions":[ 
      { 
        "name": "ohos.permission.PERMISSION_X", // user_grant类型预授权的权限名 
        "userCancellable": false // 用户不可取消授权 
      }, 
      { 
        "name": "ohos.permission.PERMISSION_Y", // user_grant类型预授权的权限名 
        "userCancellable": true // 用户可取消授权 
      } 
    ] 
  } 
]
分享
微博
QQ
微信
回复
2024-05-23 16:52:51
相关问题
Stage模型如何申请网络访问权限
857浏览 • 1回复 待解决
api 9 申请网络权限报错
2292浏览 • 1回复 待解决
如何申请设备上的媒体读写权限
888浏览 • 1回复 待解决
PolarDB权限管理是什么?
1606浏览 • 1回复 待解决
动态申请权限能否添加描述
265浏览 • 1回复 待解决
关于MySQL用户权限的问题
1334浏览 • 1回复 待解决
权限申请与校验,该如何处理啊?
431浏览 • 1回复 待解决
申请拨打电话权限无效
4756浏览 • 1回复 待解决
应用获取不同权限demo
466浏览 • 1回复 待解决
apache下文件夹没有访问权限
1041浏览 • 0回复 待解决
如何管理PolarDB数据库集群账号权限
1682浏览 • 1回复 待解决
关于权限申请的配置文件声明
578浏览 • 1回复 待解决
关于获取应用列表权限问题?
2099浏览 • 1回复 待解决