1# 安全控件开发指导 2 3 4## 场景介绍 5 6安全控件是OpenHarmony提供的一组系统实现的ArkUI组件,应用集成这类组件就可以实现在用户点击后自动授权,而无需弹窗授权。 7 8目前有三类安全控件,分别是位置控件(LocationButton)、粘贴控件(PasteButton)、保存控件(SaveButton),分别对应精准定位、剪贴板读取、媒体库写入三类特权,下面分别说明这三种使用场景。 9 10- 位置控件(LocationButton) 11 12应用集成位置控件后,用户点击该控件,不管应用有没有申请过或者授予精准定位权限,都会在本次前台期间获得精准定位的授权,可以调用位置服务获取精准定位。精准定位的临时授权会持续到位置控件销毁、灭屏、应用切后台、应用退出等任一情况发生,之后恢复到临时授权之前的授权状态(授予/未授予/未申请)。应用在授权期间没有调用特权接口的次数限制。 13 14使用场景:应用本身不是强位置关联应用(如导航、运动健康等),仅在"部分场景前台"需要使用位置信息(如:定位城市、打卡、分享位置等),如果需要长时间或者后台使用位置信息,建议申请权限。 15 16- 粘贴控件(PasteButton) 17 18应用集成粘贴控件后,用户点击该控件,应用读取剪贴板数据时不会弹出toast提示,直到新的数据被写入剪贴板为止(如用户复制了新的数据),灭屏、应用切后台、应用退出不影响授权,应用在授权期间没有次数限制。 19 20使用场景:粘贴控件可以用于任何应用需要读取剪贴板的场景,避免toast提示对用户造成干扰。 21 22- 保存控件(SaveButton) 23 24应用集成保存控件后,用户点击该控件,应用会获取5秒内单次访问媒体库特权接口的授权。 25 26开发者需要注意: 27 281. 应用在onClick()触发回调到调用媒体库特权接口的时间间隔不大于5秒。 29 302. 用户点击一次仅获取一次授权调用。 31 323. 使用场景:保存控件可以用于任何应用需要保存文件到媒体库的场景(保存图片、保存视频等),区别于使用filepicker方式(filepicker需要拉起系统应用,再由用户选择具体路径保存文件),安全控件操作更快捷。 33 34 35## 创建方式 36 37安全控件是由图标、文本、背景组成的类似button的按钮,其中图标、文本两者至少有其一,背景是可选的。图标和文本不支持自定义,仅支持在已有的选项中选择。应用申明安全控件的接口时,分为传参和不传参两种,不传参默认创建图标+文字+背景的按钮,传参根据传入的参数创建,不包含没有配置的元素。 38 39例如保存控件: 40 41``` 42/* 默认样式 */ 43SaveButton() 44 45/* 只有图标的样式 */ 46SaveButton({ icon:SaveIconStyle.FULL_FILLED }) 47 48/* 只有文字和图标的样式 */ 49SaveButton({ icon:SaveIconStyle.FULL_FILLED, text:SaveDescription.DOWNLOAD }) 50``` 51 52 53## 公共属性 54 55安全控件有公共的UX属性,应用可以通过这些属性定制样式。 56 57| 属性名 | 描述 | 58| -------- | -------- | 59| iconSize(value: Dimension) | 设置安全控件的图标尺寸 | 60| layoutDirection(value: SecurityComponentLayoutDirection) | 设置安全控件上图标和文字分布的方向 | 61| position(value: Position) | 设置绝对定位 | 62| markAnchor(value: Position) | 设置绝对定位的锚点 | 63| offset(value: Position) | 设置相对定位 | 64| fontSize(value: Dimension) | 设置安全控件上的文字尺寸 | 65| fontStyle(value: FontStyle) | 设置安全控件上的文字样式 | 66| fontWeight(value: number \| FontWeight \| string) | 设置安全控件上文字粗细 | 67| fontFamily(value: string \| Resource) | 设置安全控件上文字的字体 | 68| fontColor(value: ResourceColor) | 设置安全控件上文字颜色 | 69| iconColor(value: ResourceColor) | 设置安全控件上图标颜色 | 70| backgroundColor(value: ResourceColor) | 设置安全控件的背景颜色 | 71| borderStyle(value: BorderStyle) | 设置安全控件边框的样式 | 72| borderWidth(value: Dimension) | 设置安全控件边框的宽度 | 73| borderColor(value: ResourceColor) | 设置安全控件的边框颜色 | 74| borderRadius(value: Dimension) | 设置安全控件的边框圆角半径 | 75| padding(value: Padding \| Dimension) | 设置安全控件的内边距 | 76| textIconSpace(value: Dimension) | 设置安全控件中图标和文字的间距 | 77 78 79## 开发步骤 80 811. ets文件中声明安全控件。 82 ``` 83 LocationButton() 84 ``` 85 862. 配置安全控件的属性。 87 ``` 88 LocationButton().iconSize(40.0) 89 ``` 90 913. 注册onCLick回调,回调中调用特权接口,以位置控件为例,获取定位信息。 92 ``` 93 import geoLocationManager from '@ohos.geoLocationManager'; 94 import BusinessError from "@ohos.base"; 95 @Entry 96 @Component 97 struct locationButton { 98 build() { 99 Row() { 100 Column() { 101 LocationButton({ icon: LocationIconStyle.FULL_FILLED }).iconSize(40.0) 102 .onClick((event: ClickEvent, result: LocationButtonOnClickResult) => { 103 if (result == LocationButtonOnClickResult.SUCCESS) { 104 /* 示例接口来自js-apis-geoLocationManager.md#currentlocationrequest */ 105 let requestInfo:geoLocationManager.CurrentLocationRequest = {'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX, 'scenario': geoLocationManager.LocationRequestScenario.UNSET,'maxAccuracy': 0}; 106 let locationChange = (err:BusinessError.BusinessError, location:geoLocationManager.Location):void => { 107 if (err) { 108 console.log('locationChanger: err=' + JSON.stringify(err)); 109 } 110 if (location) { 111 console.log('locationChanger: location=' + JSON.stringify(location)); 112 } 113 }; 114 115 try { 116 geoLocationManager.getCurrentLocation(requestInfo, locationChange); 117 } catch (err) { 118 console.error("errCode:" + (err as BusinessError.BusinessError).code + ",errMessage:" + (err as BusinessError.BusinessError).message); 119 } 120 } 121 }) 122 }.width('100%') 123 }.height('100%') 124 } 125 } 126 ``` 127