鴻蒙Next安全訪問新正規化:系統Picker與安全控制元件解析

SameX發表於2024-11-05

本文旨在深入探討華為鴻蒙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);
  }
}

在上述程式碼中,透過呼叫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);
  }
}

透過呼叫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);
  }
}

呼叫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)
  }
}

在上述程式碼中,首先透過photoAccessHelper建立了一個圖片檔案的資源路徑(uri),然後使用fileIo開啟檔案並準備寫入資料。接著獲取了一個圖片資源(這裡假設為$r('app.media.startIcon'),實際應用中應替換為真實圖片),並將其寫入到媒體庫檔案中。最後,在SaveButtononClick事件處理函式中,當使用者點選儲存控制元件且授權成功時,呼叫savePhotoToGallery()函式將照片儲存到媒體庫,並根據儲存結果顯示相應的提示資訊。

總之,鴻蒙 Next 的安全訪問機制透過系統 Picker 和安全控制元件為應用提供了更加安全、便捷的資源訪問方式。我們可以根據應用的實際需求,合理運用這些機制,實現精準化許可權管控,提升使用者體驗的同時保護使用者隱私。希望本文能夠幫助各位同仁更好地理解和運用鴻蒙 Next 的安全訪問機制,為使用者打造更加安全可靠的應用。

相關文章