版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章应用程序权限管控应用程序权限管控是一种限制应用程序访问系统资源的机制,以避免数据或功能被不当或恶意使用。默认情况下,应用程序只能访问有限的资源。但某些情况下,应用程序为了扩展程序功能,需要访问额外的系统资源、数据、功能,为此,应用程序需要明确向系统或者用户请求相应的权限,在得到允许的情况下应用程序才可以访问系统特定的资源、数据和功能。本章从以下三个方面对应用程序权限管控进行介绍:应用程序沙箱、权限控制、安全访问机制。目录10.1使用沙箱管控数据安全10.2资源访问权限管控10.3案例:向用户二次请求授权10.4练习:使手机震动10.1使用沙箱管控数据安全当在鸿蒙系统上安装一个应用程序APP时,系统会为每个应用程序创建一个私有目录,这个目录是将来应用程序文件的根目录:应用程序的所有文件将存储在这个私有目录下,并且,不同应用程序之间是不能互访其私有目录的,这个目录称为“应用程序沙箱目录”或者“应用沙箱”。鸿蒙系统使用应用沙箱技术确保应用程序数据安全。为了直观观察应用沙箱,使用DevEco工具创建一个名称为ch1001的程序工程,然后开启模拟器,并在模拟器上运行这个新创建的应用程序。此时,系统会将ch1001程序安装到鸿蒙系统上,然后运行之。现在打开模拟器文件系统,如图。用方框1框住的部分就是应用程序ch1001的沙箱,并且鸿蒙系统以创建应用程序时的Bundlename,也就是包名为名称为应用程序创建了沙箱。应用程序的沙箱包括应用程序级别的沙箱和模块级别的沙箱,图中用方框3框住的是应用程序级别的沙箱,用方框4框住的部分是模块级别的沙箱。应用程序可以编程操作这些目录,包括操作应用程序级别的沙箱和模块级别的沙箱。为了演示如何操作这些沙箱目录,修改Index.ets为如下代码:import{application}from'@kit.AbilityKit';import{fileIo}from'@kit.CoreFileKit';
@Entry@ComponentstructIndex{@Statemessage:string='HelloWorld';
build(){RelativeContainer(){Text(this.message).id('HelloWorld').fontSize($r('app.float.page_text_font_size')).fontWeight(FontWeight.Bold).alignRules({center:{anchor:'__container__',align:VerticalAlign.Center},middle:{anchor:'__container__',align:HorizontalAlign.Center}}).onClick(()=>{this.message='Welcome';
letf1=fileIo.openSync(application.getApplicationContext().filesDir+'/data1.text',fileIo.OpenMode.CREATE|fileIo.OpenMode.WRITE_ONLY);fileIo.writeSync(f1.fd,'hello,world!');fileIo.closeSync(f1.fd);
letf2=fileIo.openSync(getContext().filesDir+'/data2.text',fileIo.OpenMode.CREATE|fileIo.OpenMode.WRITE_ONLY);fileIo.writeSync(f2.fd,'hello,world!');fileIo.closeSync(f2.fd);
letf3=fileIo.openSync(this.getUIContext().getHostContext()?.filesDir+'/data3.text',fileIo.OpenMode.CREATE|fileIo.OpenMode.WRITE_ONLY);fileIo.writeSync(f3.fd,'hello,world!');fileIo.closeSync(f3.fd);})}.height('100%').width('100%')}}运行这个程序,点击“HelloWorld”文字,之后观察应用程序沙箱的变化,如图。除了可以使用filesDir操作沙箱的files子目录,还可以使用tempDir、cacheDir属性访问应用的其他沙箱子目录。应用可以根据需要使用这些沙箱子目录。10.2资源访问权限管控鸿蒙系统提供了多种资源,例如摄像头资源、麦克风资源等硬件资源,还有包括通讯录等在内的数据资源。为了系统的安全和用户隐私保护,在没有得到系统许可或者用户许可的情况下,应用程序是无法访问这些资源的。但是,应用程序为了实现特定的功能,确实要使用这些资源,则应用程序必须向系统或者用户申请资源访问授权许可。本节对应用程序访问权限管理进行介绍。10.2.1权限分类及其申请方式鸿蒙系统将权限分为两类:开放权限和受限开放权限。不同的权限类别又根据对所访问的资源重要程度,分为两种授权方式:系统授权和用户授权。因此,结合权限分类和授权方式分类,需要使用不同的手段来申请资源访问权限,具体如表。序号权限类别授权方式申请方式备注1开放权限系统授权只需一步操作:应用程序在其对应模块的module.json5文件中申请对特定资源的访问权限。将在后续章节对在module.json5文件申请权限,以及如何向用户弹窗申请权限进行介绍。2开放权限用户授权需要两步操作:其一,应用程序在其对应模块的module.json5文件中申请对特定资源的访问权限;其二,需要在应用动态运行时,使用弹窗方式向用户申请对特定资源的访问权限。3受限开放权限系统授权需要两步操作:其一,应用开发者通过华为应用市场进行单独申请特定资源访问权限并获得访问证书;其二,应用程序在其对应模块的module.json5文件中申请对特定资源的访问权限。此类权限保护的资源,一般情况下只授权系统应用使用,因此,本节不对这类权限类别做介绍。4受限开放权限用户授权需要散布操作:其一,应用开发者通过华为应用市场进行单独申请特定资源访问权限并获得访问证书;其二,应用程序在其对应模块的module.json5文件中申请对特定资源的访问权限;其三,使用弹窗方式向用户申请对特定资源的访问权限。举个例子说明表10-1的含义。在第8章,由于应用程序需要访问网络,因此需要申请访问网络的权限。访问网络的权限名称是“ohos.permission.INTERNET”,并且这个权限是“开放权限”和“系统授权”,因此,只需要在entry模块的module.json5文件中使用如下代码向系统申请权限即可:而对于“开放权限”和“用户授权”的权限,应用程序不仅需要在模块的module.json5文件中申请权限,还需要使用弹窗向用户申请权限方可访问指定的资源。关于如何向用户申请权限将在后续章节介绍。{"module":{"requestPermissions":[{"name":"ohos.permission.INTERNET"//申请网络权限}],
"name":"entry",……//此处省略}10.2.2系统授权的开放权限及访问权限申请鸿蒙系统常用的系统授权的开放权限及其保护的资源如下表所示。由于这些权限是系统授权的开放权限,因此,对下表中的所有权限申请,应用程序只需要在模块的module.json5文件中声明即可。序号权限名称保护的资源说明1ohos.permission.USE_BLUETOOTH允许应用查看蓝牙的配置,包括蓝牙名称、蓝牙设备类型、开关状态等。2ohos.permission.GET_BUNDLE_INFO允许查询应用的基本信息。3ohos.permission.PREPARE_APP_TERMINATE允许应用关闭前执行自定义的预关闭动作,例如,当应用被关闭时,应用可向用户通过弹窗等方式向用户确认是否执行关闭。4ohos.permission.DISCOVER_BLUETOOTH允许应用配置本地蓝牙,查找远端设备且与之配对连接。该权限允许应用配置本地蓝牙(如设置蓝牙名称、开关蓝牙等),发起或取消设备扫描,发起蓝牙配对并连接设备。5ohos.permission.ACCELEROMETER允许应用读取加速度传感器的数据,包括:加速度计传感器、未校准加速度计传感器、线性加速器传感器。6ohos.permission.ACCESS_BIOMETRIC允许应用使用生物特征识别能力进行身份认证。该权限允许应用使用生物特征识别进行身份认证,包括检查当前设备的生物识别能力、自定义认证对话框、发起生物认证、获取生物识别提示信息等。7ohos.permission.ACCESS_NOTIFICATION_POLICY在本设备上允许应用访问通知策略。仅当控制铃声从静音到非静音时,需要申请该权限。8ohos.permission.GET_NETWORK_INFO允许应用获取数据网络信息。9ohos.permission.SET_NETWORK_INFO允许应用配置数据网络。包括激活或取消激活指定网络、获取和监听指定网络信息。10ohos.permission.GET_WIFI_INFO允许应用获取Wi-Fi信息。该权限允许应用获取Wi-Fi信息,包括Wi-Fi的开启状态、扫描结果、连接信息、连接状态、设备能力、P2P状态等信息。11ohos.permission.GYROSCOPE允许应用读取陀螺仪传感器的数据,包括:陀螺仪传感器、未校准陀螺仪传感器。12ohos.permission.INTERNET允许使用Internet网络。13ohos.permission.KEEP_BACKGROUND_RUNNING允许ServiceAbility在后台持续运行。14ohos.permission.NFC_TAG允许应用读写Tag卡片。该权限允许应用接收Tag的分发、从Tag卡片中读取内容、或写入内容到Tag中。15ohos.permission.PRIVACY_WINDOW允许应用将窗口设置为隐私窗口,禁止截屏录屏。16ohos.permission.SET_WIFI_INFO允许应用配置Wi-Fi设备,包括扫描、开关、连接、断开Wi-Fi,修改Wi-Fi配置,以及使用Wi-FiP2P的能力。17ohos.permission.VIBRATE允许应用控制马达振动,包括:单次振动、预置的振动效果、自定义振动。18ohos.permission.MODIFY_AUDIO_SETTINGS允许应用修改音频设置。19ohos.permission.RUNNING_LOCK允许应用获取运行锁,保证应用在后台的持续运行。20ohos.permission.SET_WALLPAPER允许应用设置壁纸。21ohos.permission.STORE_PERSISTENT_DATA允许应用存储持久化的数据,该数据直到设备恢复出厂设置或重装系统才会被清除。22ohos.permission.WINDOW_TOPMOST允许应用将窗口设置为应用置顶窗口。为了申请这些权限,应用程序需要在模块的module.json5文件中的requestPermissions标签进行声明。声明的一般格式如下:在此要特别注意其中的reason字段的要求:只能使用字符串资源的名称作为这个字段的值,不可使用字符串常量。{"module":{"requestPermissions":[{"name":"ohos.permission.VIBRATE",//权限名称"reason":"$string:reason",//使用字符串资源描述的申请权限的理由"usedScene":{"abilities":["FormAbility"//申请权限的UIAbility名称],"when":"inuse"//何时需要使用权限保护的资源}},//可以声明多个权限//……],
"name":"entry",……//此处省略}10.2.3用户授权的开放权限及其保护的资源列表与上一节类似,鸿蒙系统常用的用户授权的开放权限及其其保护的资源如下表所示。由于这些权限是用户授权的开放权限,因此,对下表中的所有权限申请,应用程序除了需要在模块的module.json5文件中声明以外,还需要在应用动态运行时,通过弹窗向用户请求授权。序号权限名称保护的资源说明1ohos.permission.ACCESS_BLUETOOTH允许应用接入蓝牙并使用蓝牙功能,包括扫描和发现外围蓝牙设备、与外围蓝牙设备配对和连接等操作,同时支持低功耗蓝牙的广播和扫描功能。2ohos.permission.CAMERA允许应用使用相机。3ohos.permission.LOCATION允许应用获取设备位置信息。申请条件:需要与模糊位置权限ohos.permission.APPROXIMATELY_LOCATION一起,才可申请此权限。4ohos.permission.APPROXIMATELY_LOCATION允许应用获取设备模糊位置信息。5ohos.permission.MICROPHONE允许应用使用麦克风。6ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY允许应用访问公共目录下Download目录及子目录。7ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY允许应用访问公共目录下的Documents目录及子目录。8ohos.permission.CUSTOM_SCREEN_CAPTURE允许应用获取屏幕图像。应用获取此权限后,可进行截屏等操作。9ohos.permission.READ_MEDIA允许应用读取用户外部存储中的媒体文件信息。10ohos.permission.WRITE_MEDIA允许应用读写用户外部存储中的媒体文件信息。为了获得表中的权限,除了需要在模块的module.json5中进行权限声明外,还需要在程序运行时通过弹窗动态向用户请求权限。下一节对如何通过弹窗动态向用户请求权限进行说明。10.2.4通过弹窗动态向用户请求用户授权的开放权限当应用程序需要访问用户的隐私信息或使用某些系统共嗯时,例如获取位置信息、访问日历、使用相机拍摄照片或录制视频等,除了需要在模块的module.json5中声明权限外,还需要通过弹窗向用户请求授权:如果当前用户尚未授予应用所需的权限,该请求会拉起动态授权弹框,向用户请求授权。可以按照如下步骤向用户请求授权:第一步:校验当前是否已经授权在进行权限申请之前,需要先检查当前应用程序是否已经被授予需要的权限。该检查可以通过调用checkAccessToken()方法来校验当前是否已经授权。如果已经授权,则可以直接访问目标操作,否则需要进行下一步操作,即向用户申请授权。第二步:动态向用户申请授权动态向用户申请权限是指在应用程序运行时向用户请求授权的过程。可以通过调用requestPermissionsFromUser()方法来实现。该方法接收一个权限列表参数,其中列出所需请求的权限,可以一次请求多个权限。用户可以选择授予权限或者拒绝授权。第三步:处理授权结果调用requestPermissionsFromUser()方法后,应用程序将等待用户授权的结果。如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统应用“设置”中打开相应的权限,提示用户具体操作路径为:设置>隐私与安全>权限类型(如位置信息)>具体应用。下面以向用户请求位置信息为例介绍如何通过弹窗向用户请求权限。位置信息权限的名称是ohos.permission.LOCATION。参见表10-3,在请求ohos.permission.LOCATION权限时,需要同时请求ohos.permission.APPROXIMATELY_LOCATION权限。首先新建名称为ch1002的鸿蒙工程,然后,打开entry模块下的module.json5文件,向其中添加位置信息权限声明。添加权限后的module.json5文件相关内容如下:{"module":{"requestPermissions":[{"name":"ohos.permission.LOCATION",//权限名称"reason":"$string:reason",//使用字符串资源描述的申请权限的理由"usedScene":{"abilities":["EntryAbility"//申请权限的UIAbility名称],"when":"inuse"//何时需要使用权限保护的资源}},{"name":"ohos.permission.APPROXIMATELY_LOCATION",//权限名称"reason":"$string:reason",//使用字符串资源描述的申请权限的理由"usedScene":{"abilities":["EntryAbility"//申请权限的UIAbility名称],"when":"inuse"//何时需要使用权限保护的资源}}],
"name":"entry",//……其他内容,此处省略……}同时,需要在resources资源目录下的base/element/string.json文件中添加reason字符串资源的定义,修改后的string.json文件内容如下:{"string":[{"name":"module_desc","value":"moduledescription"},{"name":"EntryAbility_desc","value":"description"},{"name":"EntryAbility_label","value":"label"},{"name":"reason","value":"需要位置信息以便推送LBS服务"}]}现在修改Index.ets文件,在页面中添加两个分别用于请求位置权限和获取位置信息的按钮。修改后的Index.ets文件为如下内容:import{abilityAccessCtrl,bundleManager,Permissions}from'@kit.AbilityKit';import{BusinessError}from'@kit.BasicServicesKit';import{common}from'@kit.AbilityKit';import{geoLocationManager}from'@kit.LocationKit';
@Entry@ComponentstructIndex{@Statemessage:string='位置信息:';
privateasyncrequestLocationPermissions():Promise<boolean>{letgrantStatus1:boolean=awaitthis.checkPermissionGrant('ohos.permission.LOCATION')===abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;//获取精确定位权限状态。letgrantStatus2:boolean=awaitthis.checkPermissionGrant('ohos.permission.APPROXIMATELY_LOCATION')===abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;//获取模糊定位权限状态。//精确定位权限只能跟模糊定位权限一起申请,或者已经有模糊定位权限才能申请精确定位权限。letr:boolean=true;if(!grantStatus2&&!grantStatus1){letpermissions:Array<Permissions>=['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'];letco=this.getUIContext().getHostContext()ascommon.UIAbilityContext;r=awaitthis.reqPermissionsFromUser(permissions,co);}elseif(grantStatus2&&!grantStatus1){letpermissions:Array<Permissions>=['ohos.permission.LOCATION'];letco=this.getUIContext().getHostContext()ascommon.UIAbilityContext;r=awaitthis.reqPermissionsFromUser(permissions,co);}elseif(!grantStatus1&&!grantStatus2){letpermissions:Array<Permissions>=['ohos.permission.APPROXIMATELY_LOCATION'];letco=this.getUIContext().getHostContext()ascommon.UIAbilityContext;r=awaitthis.reqPermissionsFromUser(permissions,co);}returnr;}privateasynccheckPermissionGrant(permission:Permissions):Promise<abilityAccessCtrl.GrantStatus>{letatManager:abilityAccessCtrl.AtManager=abilityAccessCtrl.createAtManager();letgrantStatus:abilityAccessCtrl.GrantStatus=abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
lettokenId:number=0;try{letbundleInfo:bundleManager.BundleInfo=awaitbundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);letappInfo:bundleManager.ApplicationInfo=bundleInfo.appInfo;tokenId=appInfo.accessTokenId;}catch(error){consterr:BusinessError=errorasBusinessError;console.error(`Failedtogetbundleinfoforself.Codeis${err.code},messageis${err.message}`);}
//校验应用是否被授予权限。try{grantStatus=awaitatManager.checkAccessToken(tokenId,permission);}catch(error){consterr:BusinessError=errorasBusinessError;console.error(`Failedtocheckaccesstoken.Codeis${err.code},messageis${err.message}`);}
returngrantStatus;}
privateasyncreqPermissionsFromUser(permissions:Array<Permissions>,context:common.UIAbilityContext):Promise<boolean>{letatManager:abilityAccessCtrl.AtManager=abilityAccessCtrl.createAtManager();letdata=awaitatManager.requestPermissionsFromUser(context,permissions);letgrantStatus:Array<number>=data.authResults;letlength:number=grantStatus.length;for(leti=0;i<length;i++){if(grantStatus[i]!=0){returnfalse;}}returntrue;
}
privategetLocation(){letrequest:geoLocationManager.SingleLocationRequest={'locatingPriority':geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED,'locatingTimeoutMs':10000}try{geoLocationManager.getCurrentLocation(request).then((result)=>{this.message=JSON.stringify(result);('currentlocation:'+JSON.stringify(result));}).catch((error:BusinessError)=>{//接收上报的错误码console.error('promise,getCurrentLocation:error='+JSON.stringify(error));});}catch(err){console.error("errCode:"+JSON.stringify(err));this.getUIContext().getPromptAction().showToast({'message':'请在设置中开启位置定位开关'});}}
build(){Column(){Text(this.message).fontSize(25).margin(10)Button('向用户请求位置权限').fontSize(25).margin(10).onClick(()=>{this.requestLocationPermissions().then((v)=>{if(v){this.getUIContext().getPromptAction().showToast({'message':'授权成功'});}else{this.getUIContext().getPromptAction().showToast({'message':'授权失败'});}})})Button('获取位置').fontSize(25).margin(10).onClick(()=>{this.getLocation();})}.height('100%').width('100%')}}在设置中打开位置定位开发,然后运行这个程序。10.3案例:向用户二次请求授权当应用程序通过requestPermissionsFromUser()拉起弹框请求用户授权时,如果用户拒绝授权,应用将无法再次通过requestPermissionsFromUser()拉起请求授权的弹框,这时需要用户在系统应用“设置”的界面中进行手动授予权限。在设置中进行手动授权,这个过程对于用户来说可能太复杂。因此,对于普通用户,如果一旦拒绝对某个应用授权,意味着可能不能正常使用某个应用的功能。为此,应用程序需要为用户提供二次请求授权的机会。本案例介绍如何二次请求用户授权。10.3.1案例目标为了便于理解二次请求授权的需要,新建一个模拟器,在新的模拟器中运行上一节的例子,如图所示。点击“向用户请求位置权限”按钮,显示如图的界面,此时,点击“不允许”而拒绝授权。此时,再次点击“向用户请求位置权限”按钮,只会显示授权失败消息,而无法再次拉起授权弹窗。完善上一个例子,需要在用户第一次拒绝授权后,为用户提供二次授权的机会。10.3.2案例分析鸿蒙系统为应用程序提供了二次请求用户授权的机会:在用户第一次拒绝授权后,应用程序可以通过调用requestPermissionOnSetting(),直接拉起权限设置弹框,引导用户授予权限。针对上一个例子,在用户拒绝授权后,弹出一个对话框再次为用户提供一个机会确认是否为应用程序授权,如果选择授权,则调用requestPermissionOnSetting()拉起权限设置弹框,否则,直接退出不再为应用授权。10.3.3案例实施新建名为ch1003的鸿蒙工程,将上一个ch1002例子module.json5文件中声明授权的代码片段,还有string.json中的reason自负床资源定义拷贝到ch1003对应文件中,然后,拷贝ch1002的Intex.ets代码到ch1003的Index.ets文件中。然后,增加如下方法:privateshowConfirmDialog(){try{this.getUIContext().getPromptAction().showDialog({title:'位置信息授权',
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年环评工程师考试政策冲刺试卷
- 2026年国企风险管理笔试题目及核心答案
- 2026年湖北省丹江口市高一数学上册期末考试模拟卷附完整答案(考点梳理)
- 2026年山东省章丘市高一数学上册期末考试模拟检测卷及参考答案(新)
- 2026年辽宁省兴城市高一数学上册期末考试模拟卷(夺冠系列)附答案
- 2026年吉林省龙井市高一数学上册期末考试模拟检测卷附答案【培优】
- 2026年湖北省麻城市高一数学上册期末考试模拟考试卷附完整答案(名校卷)
- 2026年河北省任丘市高一数学上册期末考试模拟试卷及答案(全优)
- 2026年江苏省扬中市高一数学上册期末考试模拟试卷(黄金题型)附答案
- 静脉治疗专科护士培训试题及答案
- 2026辽宁营口水务集团有限公司招聘8人笔试备考试题及答案详解
- 紧急维修服务作业规范
- 2026年安全生产月危险化学品企业排查整治风险隐患培训课件
- 期末证据法学试题及答案
- 川贝母中药鉴定技术讲解
- 2025年上半年南通海安县招考政府购买服务人员易考易错模拟试题(共500题)试卷后附参考答案
- 企业品牌建设手册
- 河北省石家庄市石家庄二中教育集团2024年高一下学期期末考试英语试题含解析
- 个机械零件的加工工艺样本
- 区间逻辑检查功能运用办法
- 如何打造一场精彩的路演
评论
0/150
提交评论