RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙開發(fā)Ability Kit程序框架服務(wù):向用戶申請授權(quán)

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-07-01 09:18 ? 次閱讀

向用戶申請授權(quán)

當(dāng)應(yīng)用需要訪問用戶的隱私信息或使用系統(tǒng)能力時(shí),例如獲取位置信息、訪問日歷、使用相機(jī)拍攝照片或錄制視頻等,應(yīng)該向用戶請求授權(quán),這部分權(quán)限是user_grant權(quán)限。

當(dāng)應(yīng)用申請user_grant權(quán)限時(shí),需要完成以下步驟:

  1. 在配置文件中,聲明應(yīng)用需要請求的權(quán)限。
  2. 將應(yīng)用中需要申請權(quán)限的目標(biāo)對象與對應(yīng)目標(biāo)權(quán)限進(jìn)行關(guān)聯(lián),讓用戶明確地知道,哪些操作需要用戶向應(yīng)用授予指定的權(quán)限。
  3. 運(yùn)行應(yīng)用時(shí),在用戶觸發(fā)訪問操作目標(biāo)對象時(shí)應(yīng)該調(diào)用接口,精準(zhǔn)觸發(fā)動(dòng)態(tài)授權(quán)彈框。該接口的內(nèi)部會(huì)檢查當(dāng)前用戶是否已經(jīng)授權(quán)應(yīng)用所需的權(quán)限,如果當(dāng)前用戶尚未授予應(yīng)用所需的權(quán)限,該接口會(huì)拉起動(dòng)態(tài)授權(quán)彈框,向用戶請求授權(quán)。
  4. 檢查用戶的授權(quán)結(jié)果,確認(rèn)用戶已授權(quán)才可以進(jìn)行下一步操作。
  5. 開發(fā)前請熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

本章節(jié)會(huì)介紹如何完成步驟3和4。

約束與限制

  • 每次執(zhí)行需要目標(biāo)權(quán)限的操作時(shí),應(yīng)用都必須檢查自己是否已經(jīng)具有該權(quán)限。
    如需檢查用戶是否已向您的應(yīng)用授予特定權(quán)限,可以使用[checkAccessToken()]函數(shù),此方法會(huì)返回[PERMISSION_GRANTED]或[PERMISSION_DENIED]。具體示例可參考下文。
  • 每次訪問受目標(biāo)權(quán)限保護(hù)的接口之前,都需要使用[requestPermissionsFromUser()]接口請求相應(yīng)的權(quán)限。
    用戶可能在動(dòng)態(tài)授予權(quán)限后通過系統(tǒng)設(shè)置來取消應(yīng)用的權(quán)限,因此不能將之前授予的授權(quán)狀態(tài)持久化。
  • user_grant權(quán)限授權(quán)要基于用戶可知可控的原則,需要應(yīng)用在運(yùn)行時(shí)主動(dòng)調(diào)用系統(tǒng)動(dòng)態(tài)申請權(quán)限的接口,系統(tǒng)彈框由用戶授權(quán),用戶結(jié)合應(yīng)用運(yùn)行場景的上下文,識別出應(yīng)用申請相應(yīng)敏感權(quán)限的合理性,從而做出正確的選擇。
  • 系統(tǒng)不鼓勵(lì)頻繁彈窗打擾用戶,如果用戶拒絕授權(quán),將無法再次拉起彈窗,需要應(yīng)用引導(dǎo)用戶在系統(tǒng)應(yīng)用“設(shè)置”的界面中手動(dòng)授予權(quán)限。

開發(fā)步驟

以申請使用麥克風(fēng)權(quán)限為例進(jìn)行說明。

效果展示:

zh-cn_image_0000001701708034

  1. 申請ohos.permission.MICROPHONE權(quán)限。
  2. 校驗(yàn)當(dāng)前是否已經(jīng)授權(quán)。
    在進(jìn)行權(quán)限申請之前,需要先檢查當(dāng)前應(yīng)用程序是否已經(jīng)被授予權(quán)限??梢酝ㄟ^調(diào)用[checkAccessToken()]方法來校驗(yàn)當(dāng)前是否已經(jīng)授權(quán)。如果已經(jīng)授權(quán),則可以直接訪問目標(biāo)操作,否則需要進(jìn)行下一步操作,即向用戶申請授權(quán)。
    import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    const permissions: Array< Permissions > = ['ohos.permission.MICROPHONE'];
    
    async function checkPermissionGrant(permission: Permissions): Promise< abilityAccessCtrl.GrantStatus > {
      let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
      let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    
      // 獲取應(yīng)用程序的accessTokenID
      let tokenId: number = 0;
      try {
        let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
        let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
        tokenId = appInfo.accessTokenId;
      } catch (error) {
        const err: BusinessError = error as BusinessError;
        console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
      }
    
      // 校驗(yàn)應(yīng)用是否被授予權(quán)限
      try {
        grantStatus = await atManager.checkAccessToken(tokenId, permission);
      } catch (error) {
        const err: BusinessError = error as BusinessError;
        console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
      }
    
      return grantStatus;
    }
    
    async function checkPermissions(): Promise< void > {
      let grantStatus: abilityAccessCtrl.GrantStatus = await checkPermissionGrant(permissions[0]);
    
      if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
        // 已經(jīng)授權(quán),可以繼續(xù)訪問目標(biāo)操作
      } else {
        // 申請麥克風(fēng)權(quán)限
      }
    }
    
  3. 動(dòng)態(tài)向用戶申請授權(quán)。
    動(dòng)態(tài)向用戶申請權(quán)限是指在應(yīng)用程序運(yùn)行時(shí)向用戶請求授權(quán)的過程??梢酝ㄟ^調(diào)用[requestPermissionsFromUser()]方法來實(shí)現(xiàn)。該方法接收一個(gè)權(quán)限列表參數(shù),例如位置、日歷、相機(jī)、麥克風(fēng)等。用戶可以選擇授予權(quán)限或者拒絕授權(quán)。
    可以在UIAbility的onWindowStageCreate()回調(diào)中調(diào)用[requestPermissionsFromUser()]方法來動(dòng)態(tài)申請權(quán)限,也可以根據(jù)業(yè)務(wù)需要在UI中向用戶申請授權(quán)。
    • 在UIAbility中向用戶申請授權(quán)。

      import { abilityAccessCtrl, common, Permissions, UIAbility } from '@kit.AbilityKit';
      import { window } from '@kit.ArkUI';
      import { BusinessError } from '@kit.BasicServicesKit';
      
      const permissions: Array< Permissions > = ['ohos.permission.MICROPHONE'];
      function reqPermissionsFromUser(permissions: Array< Permissions >, context: common.UIAbilityContext): void {
        let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
        // requestPermissionsFromUser會(huì)判斷權(quán)限的授權(quán)狀態(tài)來決定是否喚起彈窗
        atManager.requestPermissionsFromUser(context, permissions).then((data) = > {
          let grantStatus: Array< number > = data.authResults;
          let length: number = grantStatus.length;
          for (let i = 0; i < length; i++) {
            if (grantStatus[i] === 0) {
              // 用戶授權(quán),可以繼續(xù)訪問目標(biāo)操作
            } else {
              // 用戶拒絕授權(quán),提示用戶必須授權(quán)才能訪問當(dāng)前頁面的功能,并引導(dǎo)用戶到系統(tǒng)設(shè)置中打開相應(yīng)的權(quán)限
              return;
            }
          }
          // 授權(quán)成功
        }).catch((err: BusinessError) = > {
          console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
        })
      }
      export default class EntryAbility extends UIAbility {
        onWindowStageCreate(windowStage: window.WindowStage): void {
          // ...
          windowStage.loadContent('pages/Index', (err, data) = > {
            reqPermissionsFromUser(permissions, this.context);
          // ...
          });
        }
      
        // ...
      }
      
    • 在UI中向用戶申請授權(quán)。

      import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
      import { BusinessError } from '@kit.BasicServicesKit';
      
      const permissions: Array< Permissions > = ['ohos.permission.MICROPHONE'];
      function reqPermissionsFromUser(permissions: Array< Permissions >, context: common.UIAbilityContext): void {
        let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
        // requestPermissionsFromUser會(huì)判斷權(quán)限的授權(quán)狀態(tài)來決定是否喚起彈窗
        atManager.requestPermissionsFromUser(context, permissions).then((data) = > {
          let grantStatus: Array< number > = data.authResults;
          let length: number = grantStatus.length;
          for (let i = 0; i < length; i++) {
            if (grantStatus[i] === 0) {
              // 用戶授權(quán),可以繼續(xù)訪問目標(biāo)操作
            } else {
              // 用戶拒絕授權(quán),提示用戶必須授權(quán)才能訪問當(dāng)前頁面的功能,并引導(dǎo)用戶到系統(tǒng)設(shè)置中打開相應(yīng)的權(quán)限
              return;
            }
          }
          // 授權(quán)成功
        }).catch((err: BusinessError) = > {
          console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
        })
      }
      
      @Entry
      @Component
      struct Index {
        aboutToAppear() {
          const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
          reqPermissionsFromUser(permissions, context);
        }
      
        build() {
          // ...
        }
      }
      

      HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

      QQ瀏覽器截圖20240320150855.png

  4. 處理授權(quán)結(jié)果。
    調(diào)用[requestPermissionsFromUser()]方法后,應(yīng)用程序?qū)⒌却脩羰跈?quán)的結(jié)果。如果用戶授權(quán),則可以繼續(xù)訪問目標(biāo)操作。如果用戶拒絕授權(quán),則需要提示用戶必須授權(quán)才能訪問當(dāng)前頁面的功能,并引導(dǎo)用戶到系統(tǒng)應(yīng)用“設(shè)置”中打開相應(yīng)的權(quán)限。
    路徑:設(shè)置 > 隱私 > 權(quán)限管理 > 應(yīng)用 > 目標(biāo)應(yīng)用

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    403

    瀏覽量

    17469
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2333

    瀏覽量

    42790
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙開發(fā)接口Ability框架:【@ohos.ability.featureAbility (FeatureAbility模塊)】

    FeatureAbility模塊提供帶有UI設(shè)計(jì)與用戶交互的能力,包括啟動(dòng)新的ability、獲取dataAbilityHelper、設(shè)置此Page Ability、獲取當(dāng)前Ability
    的頭像 發(fā)表于 05-06 16:31 ?995次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【@ohos.<b class='flag-5'>ability</b>.featureAbility (FeatureAbility模塊)】

    鴻蒙Ability Kit程序框架服務(wù))【ServiceExtensionAbility】

    [ServiceExtensionAbility]是SERVICE類型的ExtensionAbility組件,提供后臺服務(wù)能力,其內(nèi)部持有了一個(gè)[ServiceExtensionContext],通過[ServiceExtensionContext]提供了豐富的接口供外部使用。
    的頭像 發(fā)表于 06-04 14:50 ?1191次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【ServiceExtensionAbility】

    鴻蒙Ability開發(fā)-Stage模型下Ability的創(chuàng)建和使用

    ) ?? \'\'); }); } ... }; UIAbilityContext模塊啟動(dòng)Ability的能力 UIAbilityContext模塊提供允許訪問特定Ability的資源的能力,包括對Ability的啟動(dòng)、停止
    發(fā)表于 01-08 15:34

    鴻蒙原生應(yīng)用元服務(wù)-訪問控制(權(quán)限)開發(fā)Stage模型向用戶申請授權(quán)

    之前,需要先檢查當(dāng)前應(yīng)用程序是否已經(jīng)被授予了權(quán)限??梢酝ㄟ^調(diào)用checkAccessToken()方法來校驗(yàn)當(dāng)前是否已經(jīng)授權(quán)。如果已經(jīng)授權(quán),則可以直接訪問目標(biāo)操作,否則需要進(jìn)行下一步操作,即
    發(fā)表于 04-15 16:44

    鴻蒙原生應(yīng)用元服務(wù)-訪問控制(權(quán)限)開發(fā)等級和類型

    ,列表中給出了詳細(xì)的權(quán)限使用理由。 應(yīng)用需要在應(yīng)用商店的詳情頁面,向用戶展示所申請的user_grant權(quán)限列表。 不同權(quán)限類型的授權(quán)流程 如權(quán)限的工作流程所示,如果應(yīng)用需要獲取目標(biāo)權(quán)限,那么需要先進(jìn)
    發(fā)表于 04-17 15:29

    鴻蒙原生應(yīng)用元服務(wù)開發(fā)-位置服務(wù)申請權(quán)限

    申請位置權(quán)限開發(fā)指導(dǎo) 場景概述 應(yīng)用在使用位置服務(wù)系統(tǒng)能力前,需要檢查是否已經(jīng)獲取用戶授權(quán)訪問設(shè)備位置信息。如未獲得
    發(fā)表于 06-18 15:27

    HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))事件推薦接入方案

    一、方案概述 當(dāng)開發(fā)者有事件想要通知到用戶時(shí),可通過應(yīng)用/元服務(wù)的云側(cè)服務(wù)器向智慧分發(fā)平臺推送事件內(nèi)容(意圖共享)。系統(tǒng)通過智慧決策判斷事件發(fā)生的條件,在滿足條件時(shí),
    發(fā)表于 11-14 15:26

    HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))綜述

    一、綜述 Intents Kit(意圖框架服務(wù))是HarmonyOS級的意圖標(biāo)準(zhǔn)體系 ,意圖連接了應(yīng)用/元服務(wù)內(nèi)的業(yè)務(wù)功能。 意圖框架能幫
    發(fā)表于 11-28 10:43

    鴻蒙應(yīng)用模型:【Ability Kit】簡介

    Ability Kit程序框架服務(wù))提供了應(yīng)用程序開發(fā)
    的頭像 發(fā)表于 05-29 14:41 ?626次閱讀
    <b class='flag-5'>鴻蒙</b>應(yīng)用模型:【<b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>】簡介

    鴻蒙Ability Kit程序框架服務(wù))【Ability內(nèi)頁面間的跳轉(zhuǎn)】

    基于Stage模型下的Ability開發(fā),實(shí)現(xiàn)Ability內(nèi)頁面間的跳轉(zhuǎn)和數(shù)據(jù)傳遞。
    的頭像 發(fā)表于 06-03 20:43 ?291次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>Ability</b>內(nèi)頁面間的跳轉(zhuǎn)】

    鴻蒙Ability Kit程序框架服務(wù))【Ability與ServiceExtensionAbility通信】

    本示例展示通過[IDL的方式]和?[@ohos.rpc]?等接口實(shí)現(xiàn)了Ability與ServiceExtensionAbility之間的通信。
    的頭像 發(fā)表于 06-05 09:28 ?476次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>Ability</b>與ServiceExtensionAbility通信】

    鴻蒙Ability Kit程序框架服務(wù))【應(yīng)用啟動(dòng)框架AppStartup】

    `AppStartup`提供了一種更加簡單高效的初始化組件的方式,支持異步初始化組件加速應(yīng)用的啟動(dòng)時(shí)間。使用啟動(dòng)框架應(yīng)用開發(fā)者只需要分別為待初始化的組件實(shí)現(xiàn)`AppStartup`提供
    的頭像 發(fā)表于 06-10 18:38 ?696次閱讀

    鴻蒙開發(fā)Ability Kit程序框架服務(wù):聲明權(quán)限

    應(yīng)用在申請權(quán)限時(shí),需要在項(xiàng)目的配置文件中,逐個(gè)聲明需要的權(quán)限,否則應(yīng)用將無法獲取授權(quán)。
    的頭像 發(fā)表于 07-01 09:22 ?329次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b><b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>:聲明權(quán)限

    鴻蒙開發(fā)Ability Kit程序框架服務(wù)向用戶申請單次授權(quán)

    基于授權(quán)最小化的原則,防止應(yīng)用獲取和濫用用戶數(shù)據(jù),針對部分應(yīng)用敏感權(quán)限,在彈窗向用戶申請授權(quán)時(shí),新增“允許本次使用”的
    的頭像 發(fā)表于 07-01 14:34 ?386次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b><b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>:<b class='flag-5'>向用戶</b><b class='flag-5'>申請</b>單次<b class='flag-5'>授權(quán)</b>

    鴻蒙開發(fā)Ability Kit程序訪問控制:向用戶申請單次授權(quán)

    受限開放的權(quán)限通常是不允許三方應(yīng)用申請的。當(dāng)應(yīng)用在申請權(quán)限來訪問必要的資源時(shí),發(fā)現(xiàn)部分權(quán)限的等級比應(yīng)用APL等級高,開發(fā)者可以選擇通過ACL方式來解決等級不匹配的問題,從而使用受限權(quán)限。
    的頭像 發(fā)表于 07-02 17:48 ?488次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b><b class='flag-5'>程序</b>訪問控制:<b class='flag-5'>向用戶</b><b class='flag-5'>申請</b>單次<b class='flag-5'>授權(quán)</b>
    RM新时代网站-首页