色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

HarmonyOS開發案例:【應用添加運行時權限】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-22 15:16 ? 次閱讀

介紹

通過AbilityAccessCtrl動態向用戶申請“允許不同設備間的數據交換”的權限,使用設備管理實例獲取周邊不可信設備列表。

說明: 查詢周邊不可信設備之前,請確保本設備與周邊設備未進行配對。如果已配對,則恢復出廠設置之后重新查詢。

相關概念

  • [訪問控制權限申請]:應用的APL(Ability Privilege Level)等級分為normal、system_basic和system_core三個等級,默認情況下,應用的APL等級都為normal等級。權限類型分為system_grant和user_grant兩種類型。應用可申請的權限項參見應用權限列表。
  • [權限類型說明]:根據授權方式的不同,權限類型可分為system_grant(系統授權)和user_grant(用戶授權)。
  • [應用ALP等級說明]:元能力權限等級APL(Ability Privilege Level)指的是應用的權限申請優先級的定義,不同APL等級的應用能夠申請的權限等級不同。
  • [應用權限列表]:在申請目標權限前,建議開發者先閱讀訪問控制開發概述-權限的工作流程。對權限的工作流程有基本的了解后,再結合以下權限的具體說明,判斷應用能否申請目標權限,提高開發效率。
  • [設備管理實例]:用于獲取可信設備和本地設備的相關信息。在調用DeviceManager的方法前,需要先通過createDeviceManager構建一個DeviceManager實例dmInstance。

約束與限制

通過DevEco Studio自動下載SDK均為public版本,public-SDK不支持開發者使用系統API。本篇Codelab使用的DeviceManager(設備管理實例)依賴于系統API,需下載full-SDK并替換工具自動下載的public-SDK。

相關權限

本篇Codelab需要在配置文件module.json5里添加允許不同設備間的數據交換權限:ohos.permission.DISTRIBUTED_DATASYNC。

環境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開發板類型:[潤和RK3568開發板]。
  • OpenHarmony系統:3.2 Release。

環境搭建

完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:

  1. [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
  2. 搭建燒錄環境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發板的燒錄]
  3. 搭建開發環境。
    1. 開始前請參考[工具準備],完成DevEco Studio的安裝和開發環境配置。
    2. 開發環境配置完成后,請參考[使用工程向導]創建工程(模板選擇“Empty Ability”)。
    3. 工程創建完成后,選擇使用[真機進行調測]。
    4. 鴻蒙開發指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

代碼結構解讀

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在gitee中提供。
搜狗高速瀏覽器截圖20240326151547.png

├──entry/src/main/ets                      // 代碼區
│  ├──common
│  │  ├──constants
│  │  │  └──CommonConstants.ets            // 公共常量類
│  │  └──util
│  │     ├──DeviceListUtil.ets             // 設備查詢工具類
│  │     ├──Logger.ets                     // 日志管理工具類
│  │     └──PermissionUtil.ets             // 權限申請工具類
│  ├──entryability
│  │  └──EntryAbility.ts                   // 程序入口類
│  ├──pages
│  │  └──HomePage.ets                      // 主頁面
│  └──view
│     ├──DeviceBean.ets                    // 設備信息類
│     ├──DeviceItem.ets                    // 設備信息對象
│     ├──DeviceListDialog.ets              // 設備列表展示彈框
│     └──NoPermissionDialog.ets            // 無權限彈框
└──entry/src/main/resource                 // 應用靜態資源目錄

頁面設計

頁面分為授權圖片、授權說明、查詢內網設備按鈕三部分,效果如圖所示:

// HomePage.ets
struct HomePage {
  @State authorizedImage: Resource = $r('app.media.ic_unauthorized');
  @State permissionDescribe: Resource = $r('app.string.no_permission');
  noPermissionDialog: CustomDialogController = new CustomDialogController({
    builder: NoPermissionDialog(),
    autoCancel: false,
    alignment: DialogAlignment.Bottom,
    offset: {
      dx: CommonConstants.DIALOG_OFFSET_X,
      dy: CommonConstants.DIALOG_OFFSET_Y
    }
  });
  deviceListDialog: CustomDialogController = new CustomDialogController({
    builder: DeviceListDialog(),
    autoCancel: false,
    alignment: DialogAlignment.Bottom,
    offset: {
      dx: CommonConstants.DIALOG_OFFSET_X,
      dy: CommonConstants.DIALOG_OFFSET_Y
    }
  })
  ...
  build() {
    Column() {
      Image(this.authorizedImage)
        ...
      Text(this.permissionDescribe)
        ...
      Column() {
        Button($r('app.string.button_text'), { type: ButtonType.Capsule, stateEffect: true })
          ...
      }
      ...
    }
    ...
  }
}

授權狀態為未授權時,點擊查詢內網設備按鈕打開未申請權限提示的彈框,效果如圖所示:

// NoPermissionDialog.ets
@CustomDialog
export struct NoPermissionDialog {
  controller: CustomDialogController;
 
  build() {
    Column() {
      Text($r('app.string.no_permission_title'))
        ...
      Text($r('app.string.clear_permission'))
        ...
      Text($r('app.string.dialog_confirm'))
        ...
        .onClick(() = > {
          this.controller.close();
        })
    }
    ...
  }
}

授權狀態為已授權時,點擊查詢內網設備按鈕打開設備查詢列表彈框,效果如圖所示:

// DeviceListDialog.ets
@CustomDialog
export struct DeviceListDialog {
  private deviceListUtil: DeviceListUtil = new DeviceListUtil();
  @State deviceList: Array< DeviceBean > = [];
  controller: CustomDialogController;
  ...
  build() {
    Column() {
      Text($r('app.string.device_list'))
        ...
      Column() {
        if (this.deviceList.length === 0) {
          Text($r('app.string.no_device'))
            ...
        } else {
          Column() {
            List() {
              ForEach(this.deviceList, (item: DeviceBean, index: number) = > {
                ListItem() {
                  DeviceItem({item: item, index: index});
                }
              }, (item: DeviceBean) = > JSON.stringify(item))
            }
          }
          ...
        }
      }
      ...
      Text($r('app.string.dialog_confirm'))
        ...
        .onClick(() = > {
          this.deviceListUtil.stopDeviceDiscovery();
          this.controller.close();
        })
    }
    ...
  }
}

權限申請

首次進入主頁面彈出授權彈框,點擊禁止按鈕不會授權,點擊允許按鈕進行授權,再次進入首頁不會出現授權彈框。

// HomePage.ets
struct HomePage {
  ...
  async aboutToAppear() {
    let result = await PermissionUtil.applyPermission();
    if (result === 0) {
      this.permissionDescribe = $r('app.string.has_permission');
      this.authorizedImage = $r('app.media.ic_authorized');
    } else {
      this.permissionDescribe = $r('app.string.no_permission');
    }
  }
  ...
}

// PermissionUtil.ets
async applyPermission() {
  let atManager = abilityAccessCtrl.createAtManager();
  let data = await atManager.requestPermissionsFromUser(getContext(this), [CommonConstants.PERMISSION]);
  let grantStatus: Array< number > = data.authResults;
  let length: number = grantStatus.length;
  if (length === 0) {
    return 1;
  }
  return grantStatus[0];
}

主頁面點擊查詢內網設備按鈕時,先查詢是否授權,根據授權狀態打開對應的彈框(未授權:打開未授權彈框;已授權:打開設備查詢列表彈框)。

// HomePage.ets
struct HomePage {
  ...
  build() {
    Column() {
      ...
      Column() {
        Button($r('app.string.button_text'), { type: ButtonType.Capsule, stateEffect: true })
          ...
          .onClick(async () = > {
            let result = await PermissionUtil.checkPermission();
            if(result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
              this.deviceListDialog.open();
            } else {
              this.noPermissionDialog.open();
            }
          })
      }
      ...
    }
    ...
  }
}

// PermissionUtil.ets
async checkPermission() {
  let atManager = abilityAccessCtrl.createAtManager();
  let grantStatus: abilityAccessCtrl.GrantStatus =  abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
  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 (err) {
    Logger.error(TAG, 'getBundleInfoForSelf failed, code is ${err.code}, message is ${err.message}');
  }
  try {
    grantStatus = await atManager.checkAccessToken(tokenId, CommonConstants.PERMISSION);
  } catch (err) {
    Logger.error(TAG, 'checkAccessToken failed, code is ${err.code}, message is ${err.message}');
  }
  return grantStatus;
}

設備查詢

先創建dmInstance實例,再注冊發現設備(deviceFoundOn)的回調方法,最后調用startDeviceDiscovery方法查詢周邊設備;當查詢到設備之后調用deviceFoundOn方法處理設備信息。

//DeviceListDialog.ets
export struct DeviceListDialog {
  ...
  aboutToAppear() {
    this.deviceListUtil.initDmInstance((data: DeviceInfoInterface) = > {
      ...
    });
  }
  ...
}

// DeviceListUtil.ets
// 創建dmInstance實例
initDmInstance(dealDeviceInfo: Function) {
  this.dealDeviceInfo = dealDeviceInfo;
  try {
    deviceManager.createDeviceManager(getContext(this).applicationInfo.name, (err, data) = > {
      if (err) {
        Logger.error(TAG, 'createDeviceManager errCode:' + err.code + ',errMessage:' + err.message);
        return;
      }
      this.dmInstance = data;
      this.deviceFoundOn();
      this.startDeviceDiscovery();
    });
  } catch (err) {
    Logger.error(TAG, 'createDeviceManager err=' + JSON.stringify(err));
  }
}

// DeviceListUtil.ets
// 注冊發現設備回調方法
deviceFoundOn() {
  try {
    if (this.dmInstance !== undefined) {
      this.dmInstance.on('deviceFound', (data) = > {
        if (this.dealDeviceInfo !== undefined) {
          this.dealDeviceInfo(data);
        }
      });
    }
  } catch (err) {
    Logger.error(TAG, 'deviceFoundOn err:' + JSON.stringify(err));
  }
}

// DeviceListUtil.ets
// 發現周邊設備方法
startDeviceDiscovery() {
  this.subscribeId = Math.floor(Math.random() * CommonConstants.RANDOM_ONE + CommonConstants.RANDOM_TWO);
  let subscribeInfo: SubscribeInfoInterface = {
    subscribeId: this.subscribeId,
    mode: CommonConstants.MODE,
    medium: 0,
    freq: CommonConstants.FREQ,
    isSameAccount: false,
    isWakeRemote: true,
    capability: 1
  };
  try {
    if (this.dmInstance !== undefined) {
      this.dmInstance.startDeviceDiscovery(subscribeInfo);
    }
  } catch (err) {
    Logger.error(TAG, 'startDeviceDiscovery err:' + JSON.stringify(err));
  }
}

審核編輯 黃宇

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

    關注

    57

    文章

    2363

    瀏覽量

    42888
  • HarmonyOS
    +關注

    關注

    79

    文章

    1977

    瀏覽量

    30264
  • OpenHarmony
    +關注

    關注

    25

    文章

    3725

    瀏覽量

    16375
收藏 人收藏

    評論

    相關推薦

    如何縮短Vivado的運行時

    在Vivado Implementation階段,有時是有必要分析一下什么原因導致運行時間(runtime)過長,從而找到一些方法來縮短運行時間。
    的頭像 發表于 05-29 14:37 ?1.4w次閱讀
    如何縮短Vivado的<b class='flag-5'>運行時</b>間

    運行時添加100個項目

    列表小部件受到嚴重性能問題的影響。如果你試圖在運行時添加100個項目,它將永遠持續下去!!!!對于你添加的每一項,所需的時間加倍!我測量了這個時間,在一個200兆赫PIC32,需要超過5秒來
    發表于 04-06 16:06

    HarmonyOS應用開發-應用權限安全

    HarmonyOS應用開發安全主要分為兩個方面:應用權限和生物特征識別。應用權限嚴格按照權限分類分級模型進行定義,如圖1所示,具體過程可分為
    發表于 09-23 14:26

    如何TouchGFX運行時添加小部件、行等?

    您好,是否可以在運行時在畫布上添加一條線?我正在設法做一個 log x 比例尺,為幾十年的分隔符提供一個 Line 對象,但我的情節可能超過十年,所以我認為根據需要添加許多行,然后讓每一行都可見是一
    發表于 12-02 07:36

    運行時軟件故障注入器的設計與實現

    針對實際故障診斷中難以有效獲得故障現場信息的問題,提出通過在軟件運行時注入故障的方式獲取故障現場信息,設計并實現一種運行時軟件故障注入器,給出其中的故障腳本描
    發表于 04-06 08:40 ?19次下載

    FPGA運行時重構的延遲隱藏機制研究與實現

    FPGA運行時重構的延遲隱藏機制研究與實現_劉偉
    發表于 01-07 19:08 ?0次下載

    紫金橋組態軟件新的功能_運行時組態

    運行時組態是組態軟件新近提出的新的概念。運行時組態是在運行環境下對已有工程進行修改,添加新的功能。它不同于在線組態,在線組態是在工程運行的同
    發表于 10-13 16:17 ?2次下載
    紫金橋組態軟件新的功能_<b class='flag-5'>運行時</b>組態

    華為開發者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發案

    2021華為開發者分論壇HarmonyOS學生公開課-OpenHarmony Codelabs開發案
    的頭像 發表于 10-24 11:25 ?1928次閱讀
    華為<b class='flag-5'>開發</b>者分論壇<b class='flag-5'>HarmonyOS</b>學生公開課-OpenHarmony Codelabs<b class='flag-5'>開發案</b>例

    如何高效測量ECU的運行時

    ,最終可能會引起運行時間方面的問題。這在項目后期需要大量的時間和金錢來解決。如果不能掌握系統的運行狀態,則很難發現系統內缺陷的根源。 解決方案 將TA軟件工具套件與VX1000測量標定硬件相結合,可同步分析 ECU內部運行時序和
    的頭像 發表于 10-28 11:05 ?2239次閱讀

    Go運行時:4年之后

    自 2018 年以來,Go GC,以及更廣泛的 Go 運行時,一直在穩步改進。近日,Go 社區總結了 4 年來 Go 運行時的一些重要變化。
    的頭像 發表于 11-30 16:21 ?844次閱讀

    什么是Kubernetes容器運行時CRI

    起初,Docker是事實上的容器技術標準,Kubernetes v1.5之前的代碼中直接調用Docker API,實現容器運行時的相關操作。
    的頭像 發表于 02-20 16:22 ?1527次閱讀
    什么是Kubernetes容器<b class='flag-5'>運行時</b>CRI

    ch32v307記錄程序運行時

    ch32v307記錄程序運行時間 在程序開發中,很重要的一項任務就是對程序的運行時間進行評估。對于大型的程序系統來說,它們通常需要處理大量的數據或進行復雜的計算操作。因此,如果程序的運行時
    的頭像 發表于 08-22 15:53 ?914次閱讀

    Xilinx運行時(XRT)發行說明

    電子發燒友網站提供《Xilinx運行時(XRT)發行說明.pdf》資料免費下載
    發表于 09-14 10:01 ?0次下載
    Xilinx<b class='flag-5'>運行時</b>(XRT)發行說明

    如何保證它們容器運行時的安全?

    緊密耦合的容器運行時繼承了主機操作系統的安全態勢和攻擊面。運行時或主機內核中的任何漏洞及其利用都會成為攻擊者的潛在切入點。
    的頭像 發表于 11-03 15:24 ?688次閱讀

    jvm運行時內存區域劃分

    JVM是Java Virtual Machine(Java虛擬機)的縮寫,它是Java編程語言的運行環境。JVM的主要功能是將Java源代碼轉換為機器代碼,并且在運行時管理Java程序的內存。JVM
    的頭像 發表于 12-05 14:08 ?541次閱讀
    主站蜘蛛池模板: 日本调教网站| 一本道无码字幕在线看| 91系列在线观看免费| 欧美性xxx极品| 多人乱肉高hnp| 亚洲精品久久久无码一区二区| 久久久久久久免费| 把她带到密室调教性奴| 亚洲 欧洲 国产 日产 综合| 久久不射视频| 波多野结衣 熟女| 亚洲高清视频一区| 嫩小幼处在线| 国产一区2区| 99视频免视看| 亚洲大片免费| 欧美特级另类xxx| 黄色大片久久| 超碰97人人做人人爱亚洲尤物| 亚洲精品国产在线网站| 免费亚洲视频| 国产午夜精品福利久久| 99久久99久久精品国产片果冻| 无人区国产片| 免费在线视频一区| 好硬好湿好大再深一点动态图| FREEHDXXXX学生妹| 夜夜女人国产香蕉久久精品| 色噜噜狠狠色综合欧洲| 久热久热精品在线观看| 国产精品高清在线观看93| 97视频免费在线| 亚洲国产成人精品无码区5566| 强奷乱码中文字幕熟女免费| 九色终合九色综合88| 国产成人精品自线拍| 60岁老年熟妇在线无码| 亚洲国产日韩制服在线观看| 日日做夜夜欢狠狠免费软件| 免费夜里18款禁用软粉色| 九九久久精品|