HarmonyOS ArkUI安全控件開發指南:粘貼、保存與位置控件的實現與隱私保護實踐

目錄

  • 安全控件
    • 1. 粘貼控件
      • 1.1 約束與限制
      • 1.2 開發步驟
    • 2. 保存控件
      • 2.1 約束與限制
      • 2.2 開發步驟
    • 3. 位置控件
      • 3.1 約束與限制
      • 3.2 開發步驟

安全控件

安全控件是系統提供的一組系統實現的ArkUI組件,其中保存控件在用戶首次使用時,會彈出通知彈窗,在用戶點擊允許后自動授權,后續使用無需彈窗授權;粘貼控件在用戶點擊后自動授權,無需彈窗授權。它們可以作為一種“特殊的按鈕”融入應用頁面,實現用戶點擊即許可的設計思路。

相較于動態申請權限的方式,安全控件可基于場景化授權,簡化開發者和用戶的操作,主要優點有:

用戶可掌握授權時機,授權范圍最小化。

授權場景可匹配用戶真實意圖。

減少彈窗打擾。

開發者不必向應用市場申請權限,簡化操作。

安全控件堅持僅采集實現業務功能所必須的個人數據,以服務于用戶的需求,幫助開發透明、可選、可控的隱私合規應用。

1. 粘貼控件

粘貼控件時一種特殊的系統安全控件,它允許應用在用戶的授權下無提示地讀取剪貼板數據

在應用集成粘貼控件后,用戶點擊該控件,應用讀取剪貼板數據時不會彈窗提示。可以用于任何應用需要讀取剪貼板地場景,避免彈窗提示對用戶造成干擾。

例如,用戶在應用外復制了驗證碼,要在應用內粘貼驗證碼。用戶原來在進入應用后,還需要長按輸入框,在彈出的選項中中點擊粘貼,才能完成輸入。而使用粘貼控件,用戶只需要進入應用后直接點擊粘貼按鈕,即可一步到位。

1.1 約束與限制

  • 臨時授權會持續到滅屏、應用切后臺、應用退出情況發生。
  • 應用在授權期間沒有調用次數限制
  • 為了保障用戶的隱私不被惡意應用獲取,應用需確保安全控件時可見的且用戶能夠識別的。需要合理的配置控件的尺寸、顏色等屬性,避免視覺混淆的情況,如果發生因空間的樣式不合法導致授權失敗的情況,請檢查設備錯誤日志。

1.2 開發步驟

  1. 導入剪貼板依賴

    import { pasteboard } from '@kit.BasicServicesKit';
    
  2. 添加輸入框和粘貼控件

粘貼控件是由圖標、文本、背景組成地類似Button的按鈕,其中圖標、文本兩者至少有其一,背景必選。圖標和文本不支持自定義,僅支持在已有的選項中選擇。

應用聲明安全控件的接口時,分為傳參和不傳參兩種,不傳參默認創建圖標+文字+背景的按鈕,傳參根據傳入的參數創建,不包含沒有配置的元素。

import { pasteboard, BusinessError } from '@kit.BasicServicesKit';@Entry
@Component
struct Index {@State message: string = '';build() {Row() {Column({ space: 10 }) {TextInput({ placeholder: '請輸入驗證碼', text: this.message })PasteButton().padding({top: 12, bottom: 12, left: 24, right: 24}).onClick((event: ClickEvent, result: PasteButtonOnClickResult) => {if (PasteButtonOnClickResult.SUCCESS === result) {pasteboard.getSystemPasteboard().getData((err: BusinessError, pasteData: pasteboard.PasteData) => {if (err) {console.error(`Failed to get paste data. Code is ${err.code}, message is ${err.message}`);return;}// 剪貼板內容為 '123456'this.message = pasteData.getPrimaryText();});}})}.width('100%')}.height('100%')}
}

2. 保存控件

保存控件時一種特殊的安全控件。它允許用戶通過點擊按鈕臨時獲取存儲權限,而無需通過權限彈框進行授權確認。

集成保存控件后,當用戶點擊該控件時,應用會獲得10秒內訪問媒體庫特權接口的授權,這適用于任何需要將文件保存到媒體庫的應用場景,例如保存圖片或視頻等。

與需要觸發系統應用并由用戶選擇具體保存路徑的Picker不同,保存控件可以直接保存到指定的媒體庫路徑,使得操作更為便捷。

2.1 約束與限制

  • 當用戶首次點擊應用中的保存控件,系統將彈窗請求用戶授權。如果用戶點擊取消,彈窗消失,應用無授權,用戶再次點擊保存控件時,將會重新彈窗;如果用戶點擊允許,彈窗消失,應用將授權臨時保存權限,此后點擊該應用的保存控件將不會彈窗。
  • 應用在onClick()乘除法回調到調用媒體庫特權接口的時間間隔不能大于10秒。
  • 用戶點擊一次控件,僅獲取以此授權調用
  • 為了保證用戶的隱私不被惡應用獲取,應用需要確保安全控件時可見的,且用戶能夠識別的。需要合理配置控件的尺寸、顏色等屬性,避免視覺混淆,如果發生因控件的樣式不合法導致授權失敗的情況,請檢查設備錯誤日志。

2.2 開發步驟

  1. 導入文件和媒體庫依賴

    import { photoAccessHelper } from '@kit.MediaLibraryKit';
    import { fileIo } from '@kit.CoreFileKit';
    
  2. 設置圖片資源,并添加保存控件。

    保存控件是一種類似于按鈕的安全控件,由圖標、文本和背景組成。其中,圖標和文本至少需要有一個,背景是必選的。圖標和文本不能自定義,只能從已有的選項中選擇。在聲明安全控件的接口時,有傳參和不傳參兩種方式。不傳參將默認創建一個包含圖標、文字和背景的按鈕,傳參根據參數創建,不包含配置的元素。

    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 {// onClick觸發后10秒內通過createAsset接口創建圖片文件,10秒后createAsset權限收回。let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');// 使用uri打開文件,可以持續寫入內容,寫入過程不受時間限制let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);// $r('app.media.startIcon')需要替換為開發者所需的圖像資源文件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 }) {// $r('app.media.startIcon')需要替換為開發者所需的圖像資源文件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;// 免去權限申請和權限請求等環節,獲得臨時授權,保存對應圖片savePhotoToGallery(context);} else {promptAction.showToast({ message: '設置權限失敗!' })}})}.width('100%')}.height('100%').backgroundColor(0xF1F3F5)}
    }
    

3. 位置控件

位置控件使用直觀且易懂的通用標識,讓用戶明確的知道這是一個獲取位置信息的按鈕。滿足了授權場景需要匹配用戶真是意圖的需求。只有當用戶主管愿意,并且明確了解使用場景后點擊位置控件,應用才會獲得臨時的授權,獲取位置信息并完成相應的服務功能。

一旦應用集成了位置控件,用戶點擊該控件后,無論應用是否已經申請通過或被授權請準定位權限,都會在本次前臺獲得精準定位的授權,可以調用位置服務獲取精準定位。

對于不是請位置關聯應用的應用,只在部分前臺場景需要使用位置信息。如果需要長時間使用或是在后臺使用位置信息,建議申請位置權限。

3.1 約束與限制

  • 當用戶首次點擊應用中的位置控件,系統將彈窗請求用戶授權。如果用戶點擊取消,彈窗消失,應用無授權,用戶再次點擊位置控件時,將會重新彈窗;如果用戶點擊允許,彈窗消失,應用將被授予臨時位置權限,此后點擊該應用的位置控件將不會彈窗。
  • 精準定位的臨時授權會持續到滅屏、應用切后臺、應用退出等任一情況發生,然后恢復到臨時授權之前的授權狀態
  • 應用在授權期間沒有調用次數限制
  • 為了保障用戶的隱私不被而已應用獲取,應用需要確保安全控件是否可見切用戶能夠識別。合理配置控件的尺寸、顏色等屬性,避免視覺混淆的情況,如果發生因控件的樣式不合法導致授權失敗的情況,請檢查設備錯誤日志。

3.2 開發步驟

  1. 引入位置服務依賴

    import { geoLocationManager } from '@kit.LocationKit';
    
  2. 添加位置依賴和獲取當前位置信息

    安全控件是由圖標、文本、背景組成的類似Button的按鈕,其中圖標、文本兩者至少有其一,背景是必選的。圖標和文本不支持自定義,僅支持在已有的選項中選擇。應用申明安全控件的接口時,分為傳參和不傳參兩種,不傳參默認創建圖標+文字+背景的按鈕,傳參根據傳入的參數創建,不包含沒有配置的元素。

    import { geoLocationManager } from '@kit.LocationKit';
    import { promptAction } from '@kit.ArkUI';
    import { BusinessError } from '@kit.BasicServicesKit';// 獲取當前位置信息
    function getCurrentLocationInfo() {const requestInfo: geoLocationManager.LocationRequest = {'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,'scenario': geoLocationManager.LocationRequestScenario.UNSET,'timeInterval': 1,'distanceInterval': 0,'maxAccuracy': 0};try {geoLocationManager.getCurrentLocation(requestInfo).then((location: geoLocationManager.Location) => {promptAction.showToast({ message: JSON.stringify(location) });}).catch((err: BusinessError) => {console.error(`Failed to get current location. Code is ${err.code}, message is ${err.message}`);});} catch (err) {console.error(`Failed to get current location. Code is ${err.code}, message is ${err.message}`);}
    }@Entry
    @Component
    struct Index {build() {Row() {Column({ space: 10 }) {LocationButton({icon: LocationIconStyle.LINES,text: LocationDescription.CURRENT_LOCATION,buttonType: ButtonType.Normal}).padding({top: 12, bottom: 12, left: 24, right: 24}).onClick((event: ClickEvent, result: LocationButtonOnClickResult) => {if (result === LocationButtonOnClickResult.SUCCESS) {// 免去權限申請和權限請求等環節,獲得臨時授權,獲取位置信息授權getCurrentLocationInfo();} else {promptAction.showToast({ message: '獲取位置信息失敗!' })}})}.width('100%')}.height('100%').backgroundColor(0xF1F3F5)}
    }
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904299.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904299.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++筆記之接口`Interface`

C++筆記之接口Interface code review! 一個簡潔簡短的 C++ 接口實現示例: #include <iostream>// 1. 定義接口(抽象類) class Shape {public:

動態圖表 -- eg1

問題&#xff1a; 前端vue&#xff0c;后端springboot&#xff0c;實現動態表格樣式&#xff0c;&#xff08;表格List<Student>&#xff0c;Student類有年級&#xff0c;班級&#xff0c;文理科分類&#xff0c;姓名&#xff0c;學號&#xff0c;等屬性。先根據年級分類…

C++學習之shell高級和正則表達式

目錄 1.正則表達式 2.C中使用正則 3.復習 4.sort命令 5.uniq命令 6.wc命令 7.grep命令 8.find命令 9.xargs命令 10.sed命令 11.awk命令 12.crontab 1.正則表達式 1 管道 使用| 將多個命令拼接在一起 原理&#xff0c;就是將前一個命令的標準輸出作為后一個…

【Vue】 實現TodoList案例(待辦事項)

目錄 組件化編碼流程&#xff08;通用&#xff09; 1.實現靜態組件&#xff1a;抽取組件&#xff0c;使用組件實現靜態頁面效果 2.展示動態數據&#xff1a; 1. 常規 HTML 屬性 3.交互——從綁定事件監聽開始 什么時候要用 event&#xff1a; 什么時候不需要用 event&am…

【Bootstrap V4系列】學習入門教程之 組件-卡片(Card)

Bootstrap V4系列 學習入門教程之 組件-卡片&#xff08;Card&#xff09; 卡片&#xff08;Card&#xff09;一、Example二、Content types 內容類型2.1 Body 主體2.2 Titles, text, and links 標題、文本和鏈接2.3 Images 圖片2.4 List groups 列表組2.5 Kitchen sink 洗滌槽…

java學習之數據結構:四、樹(代碼補充)

這部分主要是用代碼實現有序二叉樹、樹遍歷、刪除節點 目錄 1.構建有序二叉樹 1.1原理 1.2插入實現 2.廣度優先遍歷--隊列實現 3.深度優先遍歷--遞歸實現 3.1先序遍歷 3.2中序遍歷 3.3后序遍歷 4.刪除 4.1刪除葉子節點 4.2刪除有一棵子樹的節點 4.3刪除有兩棵子樹的節…

架構進階:什么是數據架構,如何理解數據架構?(華為)

數據架構是企業架構的重要組成部分,DAMA、IBM 及國內大廠對其定義各有側重。它包含數據資產目錄、數據標準、數據模型和數據分布四個組件。數據資產目錄可梳理企業數據資產,數據標準統一數據含義和規則,數據模型反映業務對象關聯關系,數據分布呈現數據流動情況。數據架構是…

Unity SpriteEditor(精靈圖片編輯器)

&#x1f3c6; 個人愚見&#xff0c;沒事寫寫筆記 &#x1f3c6;《博客內容》&#xff1a;Unity3D開發內容 &#x1f3c6;&#x1f389;歡迎 &#x1f44d;點贊?評論?收藏 &#x1f50e;SpriteEditor&#xff1a; 精靈圖片編輯器 &#x1f4cc;用于編輯2D游戲開發中使用的Sp…

【網絡原理】從零開始深入理解HTTP的報文格式(一)

本篇博客給大家帶來的是網絡HTTP協議的知識點, 重點介紹HTTP的報文格式. &#x1f40e;文章專欄: JavaEE初階 &#x1f680;若有問題 評論區見 ? 歡迎大家點贊 評論 收藏 分享 如果你不知道分享給誰,那就分享給薯條. 你們的支持是我不斷創作的動力 . 王子,公主請閱&#x1f68…

ElasticSearch深入解析(九):Object、Nested、Flattened類型

文章目錄 一、Object 類型&#xff1a;默認的嵌套對象處理方式核心原理典型場景關鍵限制 二、Nested 類型&#xff1a;解決嵌套數組的關聯查詢核心原理典型場景使用示例注意事項 三、Join 類型&#xff1a;跨文檔的父子關聯核心原理典型場景使用示例注意事項 四、Flattened 類型…

36、C#中的?法聲明參數關鍵字params,ref,out的意義及?法

在C#中&#xff0c;params、ref 和 out 是方法聲明中用于修飾參數的關鍵字&#xff0c;它們各自有不同的用途和語義。以下是它們的詳細說明和用法&#xff1a; 1、 params 關鍵字 意義 params 允許方法接受可變數量的參數&#xff0c;這些參數會被編譯為一個數組。適用于參數…

【大模型實戰篇】華為信創環境采用vllm部署QwQ-32B模型

1. 背景 本文分享在華為昇騰機器上部署QwQ-32B模型的實踐。 首先華為自己是提供了一套在信創機器&#xff08;NPU&#xff09;上部署模型的方案【1】&#xff0c;但是部署之后&#xff0c;測試發現會有輸出截斷的現象。QwQ-32B本身是支持128k的最大上下文長度&#xff0c;定位…

前端面經-VUE3篇(二)--vue3基礎知識(二)計算屬性(computed)、監聽屬性(Watch)

一、計算屬性(computed) 計算屬性&#xff08;Computed Properties&#xff09;是 Vue 中一種特殊的響應式數據&#xff0c;它能基于已有的響應式數據動態計算出新的數據。 計算屬性有以下特性&#xff1a; 自動緩存&#xff1a;只有當它依賴的響應式數據發生變化時&#xff…

[預備知識] 5. 優化理論(一)

優化理論 梯度下降&#xff08;Gradient Descent&#xff09; 數學原理與可視化 梯度下降是優化領域的基石算法&#xff0c;其核心思想是沿負梯度方向迭代更新參數。數學表達式為&#xff1a; θ t 1 θ t ? α ? θ J ( θ t ) \theta_{t1} \theta_t - \alpha \nabla…

大模型微調Fine-tuning:從概念到實踐的全面解析

目錄 引言 一、什么是大模型微調&#xff1f; 1.1 預訓練與微調的區別 1.2 微調的技術演進 二、為什么需要微調&#xff1f; 2.1 解決大模型的固有局限 2.2 微調的優勢 三、主流微調方法 3.1 全參數微調 3.2 參數高效微調&#xff08;PEFT&#xff09; 四、微調實踐指…

Docker 使用下 (二)

Docker 使用下 &#xff08;二&#xff09; 文章目錄 Docker 使用下 &#xff08;二&#xff09;前言一、初識Docker1.1 、Docker概述1.2 、Docker的歷史1.3 、Docker解決了什么問題1.4 、Docker 的優點1.5 、Docker的架構圖 二、鏡像三、容器四、數據卷4.1、數據卷的概念4.2 、…

洛谷P12238 [藍橋杯 2023 國 Java A] 單詞分類

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] Copy from luogu. [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 既然都是字符串前綴的問題了&#xff0c;那當然首先就應該想到 Trie \text{Trie} Trie 樹。 我們可…

pta作業中有啟發性的程序題

1 【知識點】&#xff1a;多態 函數接口定義&#xff1a; 以Student為基類&#xff0c;構建GroupA, GroupB和GroupC三個類 裁判測試程序樣例&#xff1a; #include<iostream> #include <string> using namespace std;/* 請在這里填寫答案 */int main() {const …

Scrapy框架之CrawlSpider爬蟲 實戰 詳解

CrawlSpider 是 Scrapy 框架中一個非常實用的爬蟲基類&#xff0c;它繼承自 Spider 類&#xff0c;主要用于實現基于規則的網頁爬取。相較于普通的 Spider 類&#xff0c;CrawlSpider 可以根據預定義的規則自動跟進頁面中的鏈接&#xff0c;從而實現更高效、更靈活的爬取。 Scr…

Glide 如何加載遠程 Base64 圖片

最近有個需求&#xff0c;后端給出的圖片地址并不是正常的 URL&#xff0c;而且需要一個接口去請求&#xff0c;但是返回的是 base64 數據流。這里不關心為啥要這么多&#xff0c;原因有很多&#xff0c;可能是系統的問題&#xff0c;也可能是能力問題。當然作為我們 Android 程…