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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

向用戶申請授權

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

當應用申請user_grant權限時,需要完成以下步驟:

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

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

約束與限制

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

開發(fā)步驟

以申請使用麥克風權限為例進行說明。

效果展示:

zh-cn_image_0000001701708034

  1. 申請ohos.permission.MICROPHONE權限。
  2. 校驗當前是否已經授權。
    在進行權限申請之前,需要先檢查當前應用程序是否已經被授予權限??梢酝ㄟ^調用[checkAccessToken()]方法來校驗當前是否已經授權。如果已經授權,則可以直接訪問目標操作,否則需要進行下一步操作,即向用戶申請授權。
    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;
    
      // 獲取應用程序的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}`);
      }
    
      // 校驗應用是否被授予權限
      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) {
        // 已經授權,可以繼續(xù)訪問目標操作
      } else {
        // 申請麥克風權限
      }
    }
    
  3. 動態(tài)向用戶申請授權。
    動態(tài)向用戶申請權限是指在應用程序運行時向用戶請求授權的過程??梢酝ㄟ^調用[requestPermissionsFromUser()]方法來實現。該方法接收一個權限列表參數,例如位置、日歷、相機、麥克風等。用戶可以選擇授予權限或者拒絕授權。
    可以在UIAbility的onWindowStageCreate()回調中調用[requestPermissionsFromUser()]方法來動態(tài)申請權限,也可以根據業(yè)務需要在UI中向用戶申請授權。
    • 在UIAbility中向用戶申請授權。

      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會判斷權限的授權狀態(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) {
              // 用戶授權,可以繼續(xù)訪問目標操作
            } else {
              // 用戶拒絕授權,提示用戶必須授權才能訪問當前頁面的功能,并引導用戶到系統(tǒng)設置中打開相應的權限
              return;
            }
          }
          // 授權成功
        }).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中向用戶申請授權。

      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會判斷權限的授權狀態(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) {
              // 用戶授權,可以繼續(xù)訪問目標操作
            } else {
              // 用戶拒絕授權,提示用戶必須授權才能訪問當前頁面的功能,并引導用戶到系統(tǒng)設置中打開相應的權限
              return;
            }
          }
          // 授權成功
        }).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. 處理授權結果。
    調用[requestPermissionsFromUser()]方法后,應用程序將等待用戶授權的結果。如果用戶授權,則可以繼續(xù)訪問目標操作。如果用戶拒絕授權,則需要提示用戶必須授權才能訪問當前頁面的功能,并引導用戶到系統(tǒng)應用“設置”中打開相應的權限。
    路徑:設置 > 隱私 > 權限管理 > 應用 > 目標應用

審核編輯 黃宇

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

    關注

    0

    文章

    397

    瀏覽量

    17358
  • 鴻蒙
    +關注

    關注

    57

    文章

    2286

    瀏覽量

    42629
收藏 人收藏

    評論

    相關推薦

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

    FeatureAbility模塊提供帶有UI設計與用戶交互的能力,包括啟動新的ability、獲取dataAbilityHelper、設置此Page Ability、獲取當前Ability
    的頭像 發(fā)表于 05-06 16:31 ?868次閱讀
    <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程序框架服務)【ServiceExtensionAbility】

    [ServiceExtensionAbility]是SERVICE類型的ExtensionAbility組件,提供后臺服務能力,其內部持有了一個[ServiceExtensionContext],通過[ServiceExtensionContext]提供了豐富的接口供外部使用。
    的頭像 發(fā)表于 06-04 14:50 ?1025次閱讀
    <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'>服務</b>)【ServiceExtensionAbility】

    鴻蒙Ability Kit程序框架服務)【UIExtensionAbility】

    [UIExtensionAbility]是UI類型的ExtensionAbility組件,需要與[UIExtensionComponent]一起配合使用,開發(fā)者可以在UIAbility的頁面中通過
    的頭像 發(fā)表于 06-05 09:19 ?1195次閱讀
    <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'>服務</b>)【UIExtensionAbility】

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

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

    鴻蒙原生應用元服務-訪問控制(權限)開發(fā)Stage模型向用戶申請授權

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

    鴻蒙原生應用元服務-訪問控制(權限)開發(fā)等級和類型

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

    鴻蒙原生應用元服務開發(fā)-位置服務申請權限

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

    鴻蒙應用模型:【Ability Kit】簡介

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

    鴻蒙Ability Kit程序框架服務)【Ability內頁面間的跳轉】

    基于Stage模型下的Ability開發(fā),實現Ability內頁面間的跳轉和數據傳遞。
    的頭像 發(fā)表于 06-03 20:43 ?224次閱讀
    <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'>服務</b>)【<b class='flag-5'>Ability</b>內頁面間的跳轉】

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

    本示例展示通過[IDL的方式]和?[@ohos.rpc]?等接口實現了Ability與ServiceExtensionAbility之間的通信。
    的頭像 發(fā)表于 06-05 09:28 ?401次閱讀
    <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'>服務</b>)【<b class='flag-5'>Ability</b>與ServiceExtensionAbility通信】

    鴻蒙Ability Kit程序框架服務)【應用啟動框架AppStartup】

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

    鴻蒙開發(fā)Ability Kit程序框架服務:選擇申請權限的方式

    應用在訪問數據或者執(zhí)行操作時,需要評估該行為是否需要應用具備相關的權限。如果確認需要目標權限,則需要在應用安裝包中申請目標權限。
    的頭像 發(fā)表于 07-01 09:50 ?272次閱讀
    <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'>申請</b>權限的方式

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

    應用在申請權限時,需要在項目的配置文件中,逐個聲明需要的權限,否則應用將無法獲取授權。
    的頭像 發(fā)表于 07-01 09:22 ?241次閱讀
    <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>:聲明權限

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

    基于授權最小化的原則,防止應用獲取和濫用用戶數據,針對部分應用敏感權限,在彈窗向用戶申請授權時,新增“允許本次使用”的
    的頭像 發(fā)表于 07-01 14:34 ?318次閱讀
    <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'>向用戶</b><b class='flag-5'>申請</b>單次<b class='flag-5'>授權</b>

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

    受限開放的權限通常是不允許三方應用申請的。當應用在申請權限來訪問必要的資源時,發(fā)現部分權限的等級比應用APL等級高,開發(fā)者可以選擇通過ACL方式來解決等級不匹配的問題,從而使用受限權限。
    的頭像 發(fā)表于 07-02 17:48 ?399次閱讀
    <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'>授權</b>