DEV Community

SameX
SameX

Posted on

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

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前 API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

在当今数字化时代,用户隐私和数据安全备受关注,鸿蒙 Next 系统凭借其创新的安全访问机制,为用户提供了更安全、便捷的操作体验。今天,我们将深入探讨鸿蒙 Next 的安全访问机制,重点解析系统 Picker 和安全控件如何实现精准化权限管控。

一、鸿蒙 Next 安全访问机制概述

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

二、系统 Picker:便捷的资源选择与权限隔离

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

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

(二)使用系统 Picker 选择不同资源的方法

  1. 选择用户文件(FilePicker) 当应用需要获取用户文件时,可以使用 FilePicker。例如,一款文档编辑应用需要打开用户指定的文档进行编辑,它可以通过以下方式使用 FilePicker:
// 假设已经导入了相关的 Picker 模块
import { filePicker } from '@kit.SomeFilePickerKit';

async function openUserFile() {
  try {
    const fileUri = await filePicker.showOpenDialog({
      // 可以设置文件类型过滤器等参数,这里仅为示例
      filters: [
        {
          name: 'Documents',
          extensions: ['txt', 'pdf', 'docx']
        }
      ]
    });
    if (fileUri) {
      // 用户选择了文件,应用可以根据 fileUri 进行后续操作,如读取文件内容等
      console.log('用户选择的文件路径:', fileUri);
    }
  } catch (error) {
    console.error('打开文件选择器失败:', error);
  }
}
Enter fullscreen mode Exit fullscreen mode

在上述代码中,通过调用filePicker.showOpenDialog()方法,弹出文件选择器对话框,用户可以在对话框中选择符合指定过滤器的文件,应用获取到用户选择的文件路径(fileUri)后,即可进行后续的文件操作。

  1. 选择照片(PhotoViewPicker) 对于需要获取用户照片的应用,如图片编辑应用或社交分享应用,可以使用 PhotoViewPicker。以下是一个简单的示例:
import { photoViewPicker } from '@kit.SomePhotoPickerKit';

async function selectUserPhoto() {
  try {
    const photoUri = await photoViewPicker.showPhotoPicker();
    if (photoUri) {
      // 用户选择了照片,应用可以根据 photoUri 进行显示、编辑或分享等操作
      console.log('用户选择的照片路径:', photoUri);
    }
  } catch (error) {
    console.error('打开照片选择器失败:', error);
  }
}
Enter fullscreen mode Exit fullscreen mode

通过调用photoViewPicker.showPhotoPicker()方法,应用可以拉起照片选择器,用户选择照片后,应用获取照片的路径(photoUri)用于后续处理。

  1. 选择联系人(联系人 Picker) 当应用需要获取联系人信息时,例如通讯类应用添加联系人或发送消息时选择收件人,可以使用联系人 Picker。示例代码如下:
import { contactPicker } from '@kit.SomeContactPickerKit';

async function selectContact() {
  try {
    const contact = await contactPicker.showContactPicker();
    if (contact) {
      // 用户选择了联系人,应用可以获取联系人的相关信息,如姓名、电话号码等
      console.log('用户选择的联系人:', contact);
    }
  } catch (error) {
    console.error('打开联系人选择器失败:', error);
  }
}
Enter fullscreen mode Exit fullscreen mode

调用contactPicker.showContactPicker()方法后,用户可以在联系人选择器中选择所需联系人,应用获取联系人对象(contact)并进行相应操作。

三、安全控件:临时授权的得力助手

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

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

(二)三种安全控件的功能与使用场景

  1. 粘贴控件(PasteButton)
    • 功能:粘贴控件用于简化应用读取剪贴板数据的操作。当应用集成粘贴控件后,用户点击该控件,应用可以在无弹窗提示的情况下读取剪贴板数据,提供了更加流畅的用户体验。
    • 使用场景:适用于各种需要读取剪贴板数据的场景,如在输入框中快速粘贴复制的文本内容。例如,在登录界面,用户可以方便地粘贴账号或密码,而无需繁琐的长按输入框等操作。
  2. 保存控件(SaveButton)
    • 功能:保存控件允许用户通过点击按钮临时获取存储权限,将文件保存到媒体库。与传统的保存方式不同,它无需用户手动选择保存路径,直接将文件保存到指定媒体库路径,操作更加快捷。
    • 使用场景:常用于需要保存文件到媒体库的场景,如保存图片、视频等。例如,在拍照应用中,用户拍摄照片后,点击保存控件即可将照片快速保存到相册中。
  3. 位置控件(LocationButton)
    • 功能:位置控件使用户能够明确知晓应用获取位置信息的意图。当用户点击该控件时,无论应用是否已申请精准定位权限,都能在本次前台期间获得精准定位授权,调用位置服务获取位置信息。
    • 使用场景:适用于非强位置关联应用在部分前台场景需要使用位置信息的情况,如定位城市、打卡、分享位置等。例如,在旅游类应用中,用户可以点击位置控件分享当前所在位置给朋友。

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

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

(四)示例代码:使用保存控件保存照片到媒体库

以下是一个使用保存控件保存照片到媒体库的示例代码:

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

// 保存照片到媒体库的函数
async function savePhotoToGallery(context: common.UIAbilityContext) {
  let helper = photoAccessHelper.getPhotoAccessHelper(context);
  try {
    // 创建图片文件,这里使用默认的图片类型和格式,实际应用中可根据需求调整
    let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
    // 打开文件,准备写入内容
    let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
    // 假设这里有一个图片资源,实际应用中应替换为真实的图片资源
    context.resourceManager.getMediaContent($r('app.media.startIcon').id, 0)
    .then(async value => {
        let media = value.buffer;
        // 将图片数据写入媒体库文件
        await fileIo.write(file.fd, media);
        await fileIo.close(file.fd);
        promptAction.showToast({ message: '已保存至相册!' });
      });
  } catch (error) {
    const err: BusinessError = error as BusinessError;
    console.error(`Failed to save photo. Code is ${err.code}, message is ${err.message}`);
  }
}

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column({ space: 10 }) {
        // 这里假设已经有一个图片组件,用于显示要保存的图片,实际应用中应替换为真实的图片组件
        Image($r('app.media.startIcon'))
        .height(400)
        .width('100%')
        SaveButton()
        .padding({ top: 12, bottom: 12, left: 24, right: 24 })
        .onClick(async (event: ClickEvent, result: SaveButtonOnClickResult) => {
            if (result === SaveButtonOnClickResult.SUCCESS) {
              const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
              // 点击保存控件时,调用保存照片到媒体库的函数
              await savePhotoToGallery(context);
            } else {
              promptAction.showToast({ message: '设置权限失败!' });
            }
          })
      }
    .width('100%')
    }
  .height('100%')
  .backgroundColor(0xF1F3F5)
  }
}
Enter fullscreen mode Exit fullscreen mode

在上述代码中,首先通过photoAccessHelper创建了一个图片文件的资源路径(uri),然后使用fileIo打开文件并准备写入数据。接着获取了一个图片资源(这里假设为$r('app.media.startIcon'),实际应用中应替换为真实图片),并将其写入到媒体库文件中。最后,在SaveButtononClick事件处理函数中,当用户点击保存控件且授权成功时,调用savePhotoToGallery()函数将照片保存到媒体库,并根据保存结果显示相应的提示信息。

总之,鸿蒙 Next 的安全访问机制通过系统 Picker 和安全控件为应用提供了更加安全、便捷的资源访问方式。我们可以根据应用的实际需求,合理运用这些机制,实现精准化权限管控,提升用户体验的同时保护用户隐私。希望本文能够帮助各位同仁更好地理解和运用鸿蒙 Next 的安全访问机制,为用户打造更加安全可靠的应用。

Top comments (0)