购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1.5 应用权限

鸿蒙操作系统拥有较为全面的安全机制,这是为了避免步入Android的后尘。在早期版本的Android操作系统中,应用程序可以几乎无限制地访问设备上的用户隐私和各种危险模块。例如,有些Android应用程序会在没有通知用户的情况下访问通讯录、短信和通话记录,或者偷偷获取设备的地理位置信息,亦或者打开话筒和相机记录现场状况,并偷偷地上传到服务器,甚至将其发送到其他用户手中,造成了严重的隐私泄露和系统安全问题。后来,Android操作系统引入了权限机制,在一定程度上避免了上述情况的发生。

为了保护用户隐私与系统安全,鸿蒙操作系统在一开始就设计了完整的安全保障机制,同样具备权限机制。应用程序在默认情况下对于系统和设备的访问权限是十分有限的,因此,开发者有义务对应用的权限进行管理和控制。在开发一些涉及用户隐私和系统安全的功能时,需要开发者申请权限,甚至需要动态申请权限。

应用权限分为非敏感权限和敏感权限。非敏感权限会在应用安装时提示用户,一般不涉及用户隐私和危险性操作,如访问网络、使用震动发动机等。敏感权限不仅会在应用安装时提示用户,而且需要在应用运行期间通过弹窗的方式提示用户进行动态授权,如访问位置信息、访问相机、访问话筒等。

对于开发者来讲,非敏感权限仅需要在config.json中声明即可,而敏感权限不仅需要在config.json中声明,还需要在代码中动态申请。

1.在config.json中声明权限

在config.json中,需要在module对象下的reqpermission数组中添加权限对象。权限对象包括name、reason、usedScene等属性,其属性的功能如下:

(1)name:权限名称。

(2)reason:申请该权限的原因。对于敏感权限来讲,弹窗请求用户授权时会提示该原因。

(3)usedScene:权限的应用场景,包括ability数组和when字符串属性。ability属性指定了该权限所涉及的Ability,离开相应的Ability将无法使用这个权限。when属性指定了权限的使用时间,可以设置为inuse(使用时)或always(始终)。

name属性是必填项,其他的属性是选填项。对于非敏感权限,通常只需使用name属性。例如,如果应用程序需要访问网络,则只需将name属性为网络访问权限名称字符串ohos.permission.INTERNET的权限对象添加到reqpermission数组中,代码如下:

对于敏感权限,可以填写权限对象中的reason等属性,用作提示用户等。例如,如果应用程序需要访问设备的地理位置,则可以填写访问原因和相应的场景信息,代码如下:

2.动态申请权限

对于敏感权限来讲,还需要在应用程序运行时动态申请权限。动态申请权限时通常需要以下几步:

(1)判断权限是否已动态授权。通过verifySelfPermission(String permissionName)方法可以查询权限是否已经被当前进程授权:传入权限名称参数permissionName,如果返回值为IBundleManager.PERMISSION_GRANTED则表示被授权,如果返回值为IBundleManager.PERMISSION_DENIED则表示未被授权。

(2)判断权限是否可以被授权。通过canRequestPermission(String permissionName)方法即可判断当前进程是否可以被动态授权。不能动态授权的原因可能是该应用权限在系统设置中被禁用,也可能是用户在之前进行弹窗授权时选择了禁用选项,还可能是该应用权限没有在config.json中被声明。

(3)弹框授权。通过requestPermissionsFromUser(String[ ]permissions,int requestCode)即可实现弹窗授权,该方法的第1个参数是permissions数组,可以同时授权多个权限,即依次弹出多个授权窗口。开发者可以选择在应用第一次运行时提示用户对多个敏感权限统一进行授权,也可以在使用敏感权限时实时请求权限。

统一申请多个敏感权限的典型代码如下:

在上述代码中权限名称还可以使用SystemPermission类的常量字符串,例如ohos.permission.LOCATION字符串还可以被SystemPermission.LOCATION常量代替。初学者可先不用细究这段代码,直接应用在动态授权场景即可。

动态申请权限的弹窗如图2-9所示。

图2-9 动态申请权限的弹窗 MHfZJe/CeU2G5CQxtcxqOMMLCzBdrMT40D1Pedq659/Wr//FrAobW7eM04VuoZmR

点击中间区域
呼出菜单
上一章
目录
下一章
×