鸿蒙Next安全访问新范式:系统Picker与安全控件剖析

打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本文旨在深入探究华为鸿蒙HarmonyOS Next系统(截止目前 API12)在开辟多语言电商平台方面的技能细节,基于现实开辟实践举行总结。主要作为技能分享与交换载体,难免错漏,接待各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
  在当今数字化时代,用户隐私和数据安全备受关注,鸿蒙 Next 系统凭借其创新的安全访问机制,为用户提供了更安全、便捷的操作体验。本日,我们将深入探究鸿蒙 Next 的安全访问机制,重点剖析系统 Picker 和安全控件怎样实现精准化权限管控。
一、鸿蒙 Next 安全访问机制概述

鸿蒙 Next 的安全访问机制旨在改变传统应用获取用户数据的方式,从粗放式管理变化为精细化控制,确保用户隐私得到充实保护。系统通过引入系统 Picker 和安全控件等机制,让用户能够更加精准地掌控应用对敏感数据的访问权限,实现按需授权,使数据与应用之间的交互处于受控状态。这就好比为用户数据设置了一道道智能关卡,只有在用户明确授权的情况下,应用才能获取相应的数据资源。
二、系统 Picker:便捷的资源选择与权限隔离

(一)系统 Picker 的概念与功能

系统 Picker 是鸿蒙 Next 提供的一种系统级组件,由独立进程实现,其功能雷同于一个智能的资源选择器。它答应应用在不直接获取相关权限的情况下,通过用户交互的方式选择特定的资源,如文件、照片、联系人等。当应用需要访问这些资源时,只需拉起系统 Picker,由用户在 Picker 界面上举行选择操作,应用即可获取用户选择的资源效果,而无需申请读取整个资源库的权限。这就像是在一个大型图书馆中,应用不需要获取所有书籍的借阅权限,只需通过图书管理员(系统 Picker)帮助用户挑选出所需的书籍(资源)即可。
(二)使用系统 Picker 选择不同资源的方法


  • 选择用户文件(FilePicker)
    当应用需要获取用户文件时,可以使用 FilePicker。例如,一款文档编辑应用需要打开用户指定的文档举行编辑,它可以通过以下方式使用 FilePicker:
  1. // 假设已经导入了相关的 Picker 模块
  2. import { filePicker } from '@kit.SomeFilePickerKit';
  3. async function openUserFile() {
  4.   try {
  5.     const fileUri = await filePicker.showOpenDialog({
  6.       // 可以设置文件类型过滤器等参数,这里仅为示例
  7.       filters: [
  8.         {
  9.           name: 'Documents',
  10.           extensions: ['txt', 'pdf', 'docx']
  11.         }
  12.       ]
  13.     });
  14.     if (fileUri) {
  15.       // 用户选择了文件,应用可以根据 fileUri 进行后续操作,如读取文件内容等
  16.       console.log('用户选择的文件路径:', fileUri);
  17.     }
  18.   } catch (error) {
  19.     console.error('打开文件选择器失败:', error);
  20.   }
  21. }
复制代码
在上述代码中,通过调用filePicker.showOpenDialog()方法,弹出文件选择器对话框,用户可以在对话框中选择符合指定过滤器的文件,应用获取到用户选择的文件路径(fileUri)后,即可举行后续的文件操作。

  • 选择照片(PhotoViewPicker)
    对于需要获取用户照片的应用,如图片编辑应用或交际分享应用,可以使用 PhotoViewPicker。以下是一个简单的示例:
  1. import { photoViewPicker } from '@kit.SomePhotoPickerKit';
  2. async function selectUserPhoto() {
  3.   try {
  4.     const photoUri = await photoViewPicker.showPhotoPicker();
  5.     if (photoUri) {
  6.       // 用户选择了照片,应用可以根据 photoUri 进行显示、编辑或分享等操作
  7.       console.log('用户选择的照片路径:', photoUri);
  8.     }
  9.   } catch (error) {
  10.     console.error('打开照片选择器失败:', error);
  11.   }
  12. }
复制代码
通过调用photoViewPicker.showPhotoPicker()方法,应用可以拉起照片选择器,用户选择照片后,应用获取照片的路径(photoUri)用于后续处理。

  • 选择联系人(联系人 Picker)
    当应用需要获取联系人信息时,例如通讯类应用添加联系人或发送消息时选择收件人,可以使用联系人 Picker。示例代码如下:
  1. import { contactPicker } from '@kit.SomeContactPickerKit';
  2. async function selectContact() {
  3.   try {
  4.     const contact = await contactPicker.showContactPicker();
  5.     if (contact) {
  6.       // 用户选择了联系人,应用可以获取联系人的相关信息,如姓名、电话号码等
  7.       console.log('用户选择的联系人:', contact);
  8.     }
  9.   } catch (error) {
  10.     console.error('打开联系人选择器失败:', error);
  11.   }
  12. }
复制代码
调用contactPicker.showContactPicker()方法后,用户可以在联系人选择器中选择所需联系人,应用获取联系人对象(contact)并举行相应操作。
三、安全控件:暂时授权的得力助手

(一)安全控件的概念与种类

安全控件是鸿蒙 Next 提供的一组特殊的 ArkUI 组件,它们以一种直观、便捷的方式融入应用界面,实现用户点击即许可的授权模式。目前,鸿蒙 Next 提供了三种主要的安全控件:粘贴控件(PasteButton)、保存控件(SaveButton)和位置控件(LocationButton)。这些安全控件为用户提供了更精细的权限控制,使应用在获取特定权限时更加灵活和安全。
(二)三种安全控件的功能与使用场景


  • 粘贴控件(PasteButton)

    • 功能:粘贴控件用于简化应用读取剪贴板数据的操作。当应用集成粘贴控件后,用户点击该控件,应用可以在无弹窗提示的情况下读取剪贴板数据,提供了更加流畅的用户体验。
    • 使用场景:实用于各种需要读取剪贴板数据的场景,如在输入框中快速粘贴复制的文本内容。例如,在登录界面,用户可以方便地粘贴账号或暗码,而无需繁琐的长按输入框等操作。

  • 保存控件(SaveButton)

    • 功能:保存控件答应用户通过点击按钮暂时获取存储权限,将文件保存到媒体库。与传统的保存方式不同,它无需用户手动选择保存路径,直接将文件保存到指定媒体库路径,操作更加速捷。
    • 使用场景:常用于需要保存文件到媒体库的场景,如保存图片、视频等。例如,在拍照应用中,用户拍摄照片后,点击保存控件即可将照片快速保存到相册中。

  • 位置控件(LocationButton)

    • 功能:位置控件使用户能够明确知晓应用获取位置信息的意图。当用户点击该控件时,无论应用是否已申请精准定位权限,都能在本次前台期间获得精准定位授权,调用位置服务获取位置信息。
    • 使用场景:实用于非强位置关联应用在部分前台场景需要使用位置信息的情况,如定位城市、打卡、分享位置等。例如,在旅游类应用中,用户可以点击位置控件分享当前地点位置给朋友。

(三)安全控件使用场景表格展示

安全控件功能使用场景粘贴控件(PasteButton)无弹窗读取剪贴板数据快速粘贴文本,如登录界面粘贴账号暗码等保存控件(SaveButton)暂时获取存储权限保存文件到媒体库保存图片、视频,如拍照应用保存照片等位置控件(LocationButton)点击获取暂时精准定位授权定位城市、打卡、分享位置,如旅游应用分享位置等 (四)示例代码:使用保存控件保存照片到媒体库

以下是一个使用保存控件保存照片到媒体库的示例代码:
  1. import { photoAccessHelper } from '@kit.MediaLibraryKit';
  2. import { fileIo } from '@kit.CoreFileKit';
  3. import { common } from '@kit.AbilityKit';
  4. import { promptAction } from '@kit.ArkUI';
  5. import { BusinessError } from '@kit.BasicServicesKit';
  6. // 保存照片到媒体库的函数
  7. async function savePhotoToGallery(context: common.UIAbilityContext) {
  8.   let helper = photoAccessHelper.getPhotoAccessHelper(context);
  9.   try {
  10.     // 创建图片文件,这里使用默认的图片类型和格式,实际应用中可根据需求调整
  11.     let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
  12.     // 打开文件,准备写入内容
  13.     let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
  14.     // 假设这里有一个图片资源,实际应用中应替换为真实的图片资源
  15.     context.resourceManager.getMediaContent($r('app.media.startIcon').id, 0)
  16.     .then(async value => {
  17.         let media = value.buffer;
  18.         // 将图片数据写入媒体库文件
  19.         await fileIo.write(file.fd, media);
  20.         await fileIo.close(file.fd);
  21.         promptAction.showToast({ message: '已保存至相册!' });
  22.       });
  23.   } catch (error) {
  24.     const err: BusinessError = error as BusinessError;
  25.     console.error(`Failed to save photo. Code is ${err.code}, message is ${err.message}`);
  26.   }
  27. }
  28. @Entry
  29. @Component
  30. struct Index {
  31.   build() {
  32.     Row() {
  33.       Column({ space: 10 }) {
  34.         // 这里假设已经有一个图片组件,用于显示要保存的图片,实际应用中应替换为真实的图片组件
  35.         Image($r('app.media.startIcon'))
  36.         .height(400)
  37.         .width('100%')
  38.         SaveButton()
  39.         .padding({ top: 12, bottom: 12, left: 24, right: 24 })
  40.         .onClick(async (event: ClickEvent, result: SaveButtonOnClickResult) => {
  41.             if (result === SaveButtonOnClickResult.SUCCESS) {
  42.               const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  43.               // 点击保存控件时,调用保存照片到媒体库的函数
  44.               await savePhotoToGallery(context);
  45.             } else {
  46.               promptAction.showToast({ message: '设置权限失败!' });
  47.             }
  48.           })
  49.       }
  50.     .width('100%')
  51.     }
  52.   .height('100%')
  53.   .backgroundColor(0xF1F3F5)
  54.   }
  55. }
复制代码
在上述代码中,起首通过photoAccessHelper创建了一个图片文件的资源路径(uri),然后使用fileIo打开文件并预备写入数据。接着获取了一个图片资源(这里假设为$r('app.media.startIcon'),现实应用中应更换为真实图片),并将其写入到媒体库文件中。最后,在SaveButton的onClick变乱处理函数中,当用户点击保存控件且授权成功时,调用savePhotoToGallery()函数将照片保存到媒体库,并根据保存效果表现相应的提示信息。
总之,鸿蒙 Next 的安全访问机制通过系统 Picker 和安全控件为应用提供了更加安全、便捷的资源访问方式。我们可以根据应用的现实需求,合理运用这些机制,实现精准化权限管控,提升用户体验的同时保护用户隐私。盼望本文能够帮助各位同仁更好地理解和运用鸿蒙 Next 的安全访问机制,为用户打造更加安全可靠的应用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表