成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程

系統(tǒng) OpenHarmony
端云一體化是為豐富HarmonyOS對云端開發(fā)的支持、實(shí)現(xiàn)HarmonyOS生態(tài)端云聯(lián)動(dòng),DevEco Studio推出了云開發(fā)功能,開發(fā)者在創(chuàng)建工程時(shí)選擇云開發(fā)模板,即可在DevEco Studio內(nèi)同時(shí)完成HarmonyOS應(yīng)用/服務(wù)的端側(cè)與云側(cè)開發(fā)。

想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:

51CTO 開源基礎(chǔ)軟件社區(qū)

https://ost.51cto.com

一、基本概念

  • 元服務(wù)(原名原子化服務(wù))是一種基于HarmonyOS API的全新服務(wù)提供方式,以HarmonyOS萬能卡片等多種呈現(xiàn)形態(tài),向用戶提供更輕量化的服務(wù)。具有即用即走、信息外顯、服務(wù)直達(dá)的特性。
  • 萬能卡片(簡稱卡片)是一種界面展示形式,可以將應(yīng)用的重要信息或操作前置到卡片,以達(dá)到服務(wù)直達(dá)、減少體驗(yàn)層級的目的。
  • ArkUI框架是一套構(gòu)建分布式應(yīng)用界面的聲明式UI開發(fā)框架,其使用極簡的UI信息語法、豐富的UI組件、以及實(shí)時(shí)界面預(yù)覽工具,幫助開發(fā)者提升HarmonyOS應(yīng)用界面開發(fā)效率。
  • AppGallery Connect(簡稱AGC)致力于為應(yīng)用的創(chuàng)意、開發(fā)、分發(fā)、運(yùn)營、經(jīng)營各環(huán)節(jié)提供一站式服務(wù),構(gòu)建全場景智慧化的應(yīng)用生態(tài)體驗(yàn)。
  • 端云一體化是為豐富HarmonyOS對云端開發(fā)的支持、實(shí)現(xiàn)HarmonyOS生態(tài)端云聯(lián)動(dòng),DevEco Studio推出了云開發(fā)功能,開發(fā)者在創(chuàng)建工程時(shí)選擇云開發(fā)模板,即可在DevEco Studio內(nèi)同時(shí)完成HarmonyOS應(yīng)用/服務(wù)的端側(cè)與云側(cè)開發(fā)。

二、主要功能

本次開發(fā)的實(shí)用小工具主要功能有:

  • 油價(jià)查詢,點(diǎn)擊城市列表之后,就可以查看當(dāng)前城市的油價(jià),包括92,95,98,柴油等。
  • 垃圾分類查詢,輸入物品名稱就可以查看垃圾的詳細(xì)分類,而不再害怕垃圾分類出錯(cuò)。
  • 當(dāng)前定位查看,我們可以很方便的知道自己當(dāng)前的位置信息。
  • 提供12,22,24,44卡片。

API版本:API9

應(yīng)用包名:com.jianguo.utilitybox

三、項(xiàng)目初始化

  • 當(dāng)前未打開任何工程,單擊DevEco Studio歡迎頁中“Create Project”創(chuàng)建新工程。
  • 當(dāng)前已打開工程,單擊菜單欄“File > New > Create Project”創(chuàng)建新工程。

首先創(chuàng)建項(xiàng)目,選擇原子化服務(wù),第四個(gè)模版端云一體化模版

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

點(diǎn)擊下一步:

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

這個(gè)時(shí)候我們需要為工程關(guān)聯(lián)云開發(fā)所需的資源,即在DevEco Studio中選擇您的華為開發(fā)者賬號加入的開發(fā)者團(tuán)隊(duì),將該團(tuán)隊(duì)在AGC的同包名應(yīng)用關(guān)聯(lián)到當(dāng)前工程。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

然后我們點(diǎn)擊登陸就好。

這個(gè)時(shí)候會(huì)來到下面的授權(quán)頁面,我們點(diǎn)擊允許就可以。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

單擊“AppGallery Connect”打開AGC應(yīng)用創(chuàng)建向?qū)В顚憫?yīng)用信息,單擊“確認(rèn)”按鈕創(chuàng)建應(yīng)用。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

我們點(diǎn)擊箭頭這兒就會(huì)跳轉(zhuǎn)到我們的。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

agc頁面。這個(gè)時(shí)候我們選擇創(chuàng)建項(xiàng)目,然后再創(chuàng)建應(yīng)用。我之前已經(jīng)有項(xiàng)目了。所以我們直接在項(xiàng)目里創(chuàng)建應(yīng)用就可以。

比如我這里就選擇。

https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/myProject?appPackageName=com.jianguo.utilitybox&isAtomic=1。

下面這個(gè)就可以。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

然后就會(huì)跳轉(zhuǎn)到設(shè)置位置處理頁面。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

我們點(diǎn)擊下一步就會(huì)到下面的添加應(yīng)用界面,然后我們只需要填寫應(yīng)用名稱就可以,其他的都會(huì)默認(rèn),如果默認(rèn)失敗的話,我們就設(shè)置應(yīng)用包名:com.jianguo.utilitybox。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

然后確定。

這個(gè)時(shí)候就會(huì)有恭喜您!

應(yīng)用創(chuàng)建已完成。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

我們選擇前往控制臺,然后來到Severless這一塊。把我們需要的認(rèn)證服務(wù),云函數(shù),云數(shù)據(jù)庫,云緩存,云存儲,統(tǒng)統(tǒng)打開。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

我們回到IDE繼續(xù)開發(fā),點(diǎn)擊Finsh就可。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

出現(xiàn)這個(gè),我們ok就可以。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

然后大家可以看到工程配置完成。

成功創(chuàng)建工程并關(guān)聯(lián)云開發(fā)資源后,DevEco Studio會(huì)為工程自動(dòng)執(zhí)行一些初始化配置,并開通云開發(fā)相關(guān)服務(wù):認(rèn)證服務(wù)、云函數(shù)、云數(shù)據(jù)庫、云托管、API網(wǎng)關(guān)、云存儲。,所以上面我們在控制臺的操作其實(shí)也可以不用操作。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

端側(cè)工程自動(dòng)集成AGC SDK,包括AGC SDK 配置文件entry/src/main/resources/rawfile/agconnect-services.json 和在entry/oh-package.json5配置文件中引入的AGC相關(guān)云服務(wù)最新版本SDK。

"dependencies": {
    "@hw-agconnect/crypto-ohos": "^1.0.10",
    "@hw-agconnect/function-ohos": "^1.0.10",
    "@hw-agconnect/auth-ohos": "^1.0.10",
    "@hw-agconnect/cloudstorage-ohos": "^1.0.10",
    "@hw-agconnect/api-ohos": "^1.0.10",
    "@hw-agconnect/base-ohos": "^1.0.10",
    "@hw-agconnect/core-ohos": "^1.0.10",
    "@hw-agconnect/credential-ohos": "^1.0.10",
    "@ohos/agconnect-auth-component": "^1.0.5",
    "long": "5.2.1"
  }

云側(cè)工程自動(dòng)集成云數(shù)據(jù)庫最新版本Node.js Server SDK。

/Users/jianguo/Desktop/teaching/utilitybox/CloudProgram/cloudfunctions/idgenerator/package.json

"dependencies": {
		"@agconnect/database-server": "^1.0.7"
	}
}

四、端云一體化開發(fā)

大家都知道我這次用的是端云一體化開發(fā),那那么我們就有必要來了解一下端云協(xié)同的目錄結(jié)構(gòu)

端云一體化開發(fā)工程目錄分為三個(gè)子工程:如下圖所示:

  • 端開發(fā)工程(Application)。
  • 云開發(fā)工程(CloudProgram)。
  • 端側(cè)公共庫(External Libraries)。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

1、端開發(fā)工程(Application)

端開發(fā)工程主要用于開發(fā)應(yīng)用端側(cè)的業(yè)務(wù)代碼,端開發(fā)工程目錄結(jié)構(gòu)如下:

端側(cè)的目錄和之前大家看到的文件目錄結(jié)構(gòu)都差不多

- Application
    - AppScope
        app.json5    // 應(yīng)用的全局配置信息
    - entry           // 應(yīng)用/服務(wù)模塊,編譯構(gòu)建生成一個(gè)HAP
        oh_modules   // 用于存放三方庫依賴信息
        - src/main
            - ets    // 用于存放ArkTS源碼
            - resources    // 用于存放應(yīng)用/服務(wù)所用到的資源文件
            module.json5    // Stage模型配置文件
        build-profile.json5    // 當(dāng)前模塊信息、編譯信息配置項(xiàng)
        hvigorfile.ts          // 模塊級編譯構(gòu)建任務(wù)腳本
        oh-package.json5        // 配置三方包聲明的入口及包名
    build-profile.json5    // 應(yīng)用配置信息,包括簽名、產(chǎn)品配置等
    hvigorfile.ts          // 應(yīng)用級編譯構(gòu)建任務(wù)腳本

2、云開發(fā)工程(CloudProgram)

云開發(fā)工程中開發(fā)者可以為應(yīng)用開發(fā)云函數(shù)和云數(shù)據(jù)庫服務(wù)資源,云開發(fā)工程目錄結(jié)構(gòu)如下:

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

- CloudProgram
    - clouddb    // 云數(shù)據(jù)庫工程目錄
        dataentry    // 用于存放數(shù)據(jù)條目文件
        objecttype    // 用于存放對象類型文件
        db-config.json    // 模塊配置文件
    - cloudfunctions    // 云函數(shù)工程目錄
        node_modules    // 包含所有三方依賴
        cloud-config.json    // 云開發(fā)工程配置文件
        package.json    // 定義了TypeScript公共依賴

五、云函數(shù)開發(fā)指南

1、創(chuàng)建函數(shù)

在云端工程(CloudProgram)中可以創(chuàng)建函數(shù)、編寫函數(shù)業(yè)務(wù)代碼、為函數(shù)配置調(diào)用觸發(fā)器。

單擊“cloudfunctions”目錄,選擇“New > Cloud Function”創(chuàng)建云函數(shù)。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

輸入函數(shù)名稱,單擊“OK”按鈕DevEco Studio自動(dòng)生成函數(shù)目錄。函數(shù)名稱僅支持小寫英文字母、數(shù)字、中劃線(-),首字母必須為小寫字母,結(jié)尾不能為中劃線(-)。

比如add。

云函數(shù)目錄結(jié)構(gòu)。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

- add
    node_modules    // 自動(dòng)為該函數(shù)引入依賴包
    function-config.json    // 函數(shù)的配置文件,可配置觸發(fā)器,通過觸發(fā)器暴露的觸發(fā)條件來實(shí)現(xiàn)函數(shù)調(diào)用。
    package.json            // 包含了當(dāng)前函數(shù)的名稱、版本等函數(shù)元數(shù)據(jù)。
    add.ts    // 函數(shù)入口文件

云函數(shù)觸發(fā)器。

云函數(shù)觸發(fā)器在function-config.json文件中triggers屬性中配置,當(dāng)前支持HTTP觸發(fā)器、CLOUDDB觸發(fā)器、AUTH觸發(fā)器、CLOUDSTORAGE觸發(fā)器、CRON觸發(fā)器五種。

  • HTTP觸發(fā)器工程創(chuàng)建完成后默認(rèn)自動(dòng)在function-config.json文件生成HTTP觸發(fā)器配置。函數(shù)部署到云端后會(huì)自動(dòng)生成觸發(fā)URL,開發(fā)者向URL發(fā)起HTTP請求時(shí)觸發(fā)函數(shù)。
{
  "handler": "IdGenerator.myHandler",
  "triggers": [
    {
      "type": "http",
      "properties": {
        "enableUrlDecode": true,//通過HTTP觸發(fā)器觸發(fā)函數(shù),對于contentType為“application/x-www-form-urlencoded”的觸發(fā)請求,是否使用URLDecoder對請求body進(jìn)行解碼再轉(zhuǎn)發(fā)到函數(shù)中。true:啟用。false:不啟用。
        "authFlag": "true",//是否鑒權(quán),默認(rèn)為true。
        "authAlgor": "HDA-SYSTEM",//鑒權(quán)算法,默認(rèn)為HDA-SYSTEM。
        "authType": "apigw-client",//HTTP觸發(fā)器的認(rèn)證類型。apigw-client:端側(cè)網(wǎng)關(guān)認(rèn)證,適用于來自APP客戶端側(cè)的函數(shù)調(diào)用。 cloudgw-client:云側(cè)網(wǎng)關(guān)認(rèn)證,適用于來自APP服務(wù)器側(cè)的函數(shù)調(diào)用
        "mode": "NO_PATH"
      }
    }
  ]
}

2、開發(fā)云函數(shù)

云函數(shù)的代碼實(shí)現(xiàn)基于不同的語言運(yùn)行環(huán)境可分為Node.js、Java、Python,還有一種比較特別運(yùn)行環(huán)境為Custom Runtime(自定義運(yùn)行環(huán)境)。本工程的語言運(yùn)行環(huán)境為Node.js。

云函數(shù)的入口方法:

module.exports.myHandler = function(event, context, callback, logger)。

  • myHandler:入口方法名稱。
  • event:調(diào)用方傳遞的事件對象,JSON格式。
  • context:函數(shù)運(yùn)行時(shí)上下文對象,封裝了日志接口、回調(diào)接口、環(huán)境變量env對象等。
  • callback:事件處理結(jié)果。
  • logger:記錄日志。開發(fā)者在代碼中使用logger接口記錄日志,當(dāng)前支持四種級別。
  • logger.debug()
  • logger.error()
  • logger.warn()
  • logger.info()

函數(shù)必須通過顯示調(diào)用callback(object)將事件處理結(jié)果返回給AGC,結(jié)果可以是任意對象,但必須與JSON.stringify兼容,AGC會(huì)將結(jié)果轉(zhuǎn)換成JSON字符串,返回給調(diào)用方。callback執(zhí)行完成后,函數(shù)即執(zhí)行結(jié)束。

為云函數(shù)添加返回內(nèi)容。

let myHandler = async function (event, context, callback, logger) {
  logger.info(event);

  // do something here

  callback({
    code: 0,
    desc: "Success."
  });
};

export { myHandler };

調(diào)試云函數(shù) 函數(shù)開發(fā)過程中,開發(fā)者可在本地進(jìn)行調(diào)試,或者將函數(shù)部署到AGC云端后,在本地觸發(fā)調(diào)用云端函數(shù)。當(dāng)前本地調(diào)試支持Run和Debug兩種模式,Debug模式支持使用斷點(diǎn)來追蹤函數(shù)的運(yùn)行情況。

  • 本地云函數(shù)調(diào)試,單擊"cloudfunctions > Run/Debug Cloud Function"運(yùn)行/調(diào)試云函數(shù)。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

查看Run面板,若出現(xiàn)“Cloud Functions loaded successfully”,標(biāo)識云函數(shù)啟動(dòng)成功(云函數(shù)啟動(dòng)/調(diào)試將部署cloudfunctions中所有的云函數(shù)),并生成對應(yīng)的POST URL。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

在菜單欄選擇“Tools > CloudDev > Cloud Functions Requestor”觸發(fā)云函數(shù)調(diào)用。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

在彈出的云函數(shù)調(diào)用界面填寫觸發(fā)事件參數(shù)。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

  • Environment:選擇函數(shù)調(diào)用環(huán)境,Local表示本地調(diào)用,Remote表示遠(yuǎn)程調(diào)用(需要先將函數(shù)部署到AGC云端)。
  • Cloud Function:選擇需要觸發(fā)的云函數(shù)。
  • Event:輸入事件參數(shù),內(nèi)容為JSON格式請求體數(shù)據(jù)。

單擊Trigger按鈕,觸發(fā)執(zhí)行云函數(shù),執(zhí)行結(jié)果展示在Result框內(nèi),Run面板同時(shí)打印運(yùn)行日志。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

部署云函數(shù) 完成函數(shù)代碼開發(fā)后,開發(fā)者可將函數(shù)部署到AGC控制臺,支持單個(gè)部署和批量部署。

  • 右鍵單擊需要部署的函數(shù)目錄,選擇“Deploy Cloud Functions”。
  • 底部狀態(tài)欄右側(cè)將顯示函數(shù)打包與部署進(jìn)度,直至出現(xiàn)“Deploy successfully”消息表示函數(shù)部署成功。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

登錄AGC控制臺,進(jìn)入當(dāng)前項(xiàng)目的云函數(shù)服務(wù)菜單,可查看開發(fā)者部署的函數(shù)。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

遠(yuǎn)程函數(shù)測試 在“Cloud Functions Reuestor”面板中,更改Environment為Remote遠(yuǎn)程調(diào)用,單擊“Trigger”按鈕,在Result中顯示返回結(jié)果。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

當(dāng)開發(fā)者創(chuàng)建的函數(shù)或函數(shù)別名中創(chuàng)建一個(gè)HTTP類型的觸發(fā)器后,在應(yīng)用客戶端調(diào)用函數(shù)時(shí)需要傳入HTTP觸發(fā)器的標(biāo)識,查詢方法如下: 在函數(shù)的觸發(fā)器頁面點(diǎn)擊“HTTPTrigger”觸發(fā)器,查看“觸發(fā)URL”的后綴,獲取觸發(fā)器標(biāo)識,格式為“函數(shù)名-版本號”。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

3、調(diào)用云函數(shù)

應(yīng)用集成云函數(shù)SDK后,可以在應(yīng)用內(nèi)直接通過SDK API調(diào)用AGC中的云函數(shù),云函數(shù)SDK與AGC的函數(shù)調(diào)用基于HTTPS的安全訪問。

  • 在端側(cè)應(yīng)用(Application)中“entry > src/main/ets > services”目錄創(chuàng)建SudokuAlgorithmFunction.ts文件,編寫調(diào)用云函數(shù)方法。
Button('請求自定義云函數(shù)')
  .fontSize(16)
  .onClick(() => {
    getSudokuPuzzle(getContext(this)).then((ret) => {
      Log.info(Constants.LOG_TAG_NAME, `單擊按鈕調(diào)用云函數(shù)返回結(jié)果: ${JSON.stringify(ret)}`)
    })
  })

然后我們簽名,在真機(jī)中。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

六、華為認(rèn)證服務(wù)

當(dāng)前AGC認(rèn)證服務(wù)為HarmonyOS應(yīng)用/服務(wù)提供的登錄認(rèn)證方式有手機(jī)、郵箱和關(guān)聯(lián)賬號三種方式。本工程使用“郵箱+驗(yàn)證碼”的方式作為應(yīng)用的登錄入口。我們這次使用的是手機(jī)號碼登錄。

需要在AGC控制臺開通認(rèn)證服務(wù)(工程創(chuàng)建時(shí)默認(rèn)開通),并在“認(rèn)證方式”頁簽中啟用“郵箱地址”。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

調(diào)用PhoneUserBuilder生成PhoneUser,然后調(diào)用PhoneAuthProvider.credentialWithVerifyCode注冊用戶。注冊成功后,系統(tǒng)會(huì)自動(dòng)登錄,無需再次調(diào)用登錄接口。也可以使用signIn登錄接口,通過第三方認(rèn)證來登錄AGConnect平臺,在entry/src/main/ets/services/Auth.ts認(rèn)證工具類中添加郵箱賬號注冊用戶方法。

public async login(countryCode: string, phoneNumber: string, verifyCode: string): Promise<AgUser> {
        return new Promise((resolve, reject) => {
            const credential = PhoneAuthProvider.credentialWithVerifyCode(countryCode, phoneNumber, verifyCode);
            this.agc.auth().signIn(credential).then(async (ret) => {
                Log.info(TAG, "User has signed in..");
                // @ts-ignore
                let user = ret.getUser();
                let userExtra = await ret.getUser().getUserExtra();

                let loginRes = new AgUser(
                user.getUid(),
                user.getPhotoUrl(),
                user.getPhone(),
                user.getDisplayName(),
                userExtra.getCreateTime(),
                userExtra.getLastSignInTime())

                resolve(loginRes);
            }).catch((error) => {
                Log.error(TAG, "Error: ", error);
                reject(error);
            });
        });
    }

1、構(gòu)建手機(jī)登錄頁面

通過容器組件Flex、Row、Column以及基礎(chǔ)組件Text、Image、Button、Navigation、TextInput,構(gòu)建手機(jī)驗(yàn)證碼登錄頁面。

Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text($r('app.string.auth_dialog_title'))
        .fontSize($r('app.float.navigation_font_size'))
        .margin({ bottom: Constants.LENGTH_20_PX })

      Flex({ direction: FlexDirection.Row }) {

        Select(mockData)
          .font({ size: $r('app.float.body_font_size') })
          .selectedOptionFont({ size: $r('app.float.body_font_size') })
          .optionFont({ size: $r('app.float.body_font_size') })
          .value(this.countryCode)
          .layoutWeight(Constants.LENGTH_1_PX)
          .backgroundColor($r('app.color.placeholder_background'))
          .borderRadius(Constants.BORDER_RADIUS_4_PX)
          .height(Constants.HEIGHT_40)
          .onSelect((_, val) => {
            this.countryCode = val.substring(0, val.length - 4);
          })


        TextInput({ placeholder: $r('app.string.auth_dialog_number_placeholder') })
          .layoutWeight(Constants.LENGTH_3_PX)
          .margin({ left: Constants.LENGTH_5_PX })
          .borderRadius(Constants.BORDER_RADIUS_4_PX)
          .maxLength(Constants.LENGTH_20_PX)
          .height(Constants.HEIGHT_40)
          .enabled(this.timer === 60)
          .onChange((val) => {
            this.phoneNumber = val;
          })

      }
      .margin({ bottom: Constants.LENGTH_20_PX })

      Flex({ direction: FlexDirection.Row }) {
        TextInput({ placeholder: $r('app.string.auth_dialog_code_placeholder'), text: this.verificationCode })
          .layoutWeight(Constants.LENGTH_3_PX)
          .margin({ right: Constants.LENGTH_5_PX })
          .borderRadius(Constants.BORDER_RADIUS_4_PX)
          .maxLength(Constants.LENGTH_6_PX)
          .height(Constants.HEIGHT_40)
          .onChange((val) => {
            this.verificationCode = val;
          })

        Button(this.timer === 60 ? $r('app.string.auth_dialog_get_code_button_text') : this.timer.toString(), {
          type: ButtonType.Normal
        })
          .backgroundColor($r('app.color.start_window_background'))
          .layoutWeight(Constants.LENGTH_2_PX)
          .borderColor($r('app.color.action_button_background'))
          .borderWidth(Constants.LENGTH_1_PX)
          .fontColor($r('app.color.action_button_background'))
          .borderRadius(Constants.BORDER_RADIUS_4_PX)
          .margin({ left: Constants.LENGTH_5_PX })
          .height(Constants.HEIGHT_40)
          .enabled(this.canGetCode() && this.timer === 60)
          .onClick(() => this.onGetCodeButtonClicked())
      }
      .margin({ bottom: Constants.LENGTH_20_PX })


      Button($r('app.string.auth_dialog_auth_button_text'), { type: ButtonType.Normal })
        .width(Constants.PERCENT_100)
        .borderRadius(Constants.BORDER_RADIUS_4_PX)
        .backgroundColor($r('app.color.action_button_background'))
        .enabled(this.canAuthorize() && this.verificationCode.length > 5 && this.canLogin)
        .opacity(this.canLogin ? 1 : 0.5)
        .height(Constants.HEIGHT_40)
        .onClick(() => this.onAuthButtonClicked())

    }
    .height(Constants.PERCENT_50)
    .padding({ right: Constants.LENGTH_20_PX, left: Constants.LENGTH_20_PX })
  }

2、用戶登錄成功信息寫入緩存

調(diào)用自定義的登錄接口實(shí)現(xiàn)登錄,并使用首選項(xiàng)自定義工具接口將用戶信息寫入緩存。,這樣下次進(jìn)入之后,就可以進(jìn)行對應(yīng)的邏輯判斷。執(zhí)行對應(yīng)的流程。

onAuthButtonClicked() {
    this.canLogin = false;
    this.agcAuth.login(this.countryCode, this.phoneNumber, this.verificationCode).then(user => {
      AppStorage.Set<AgUser>('user', user);
      PreferencesUtil.putPreference(getContext(this), Constants.USER_AUTH_INFO, JSON.stringify(user));
      Log.info(TAG, "Logged in succesfully.");
      this.canLogin = true;
      router.replaceUrl({
        url: "pages/MainPage"
      })
    }).catch((err) => {
      this.canLogin = true;
      Log.error(TAG, "Logged in failed " + JSON.stringify(err));
      AlertDialog.show({
        title: $r('app.string.common_prompt'),
        message: $r('app.string.common_login_fail'),
      });
    });
  }

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

七、元服務(wù)開發(fā)

元服務(wù) (原為"原子化服務(wù)") 是一種基于HarmonyOS API的全新服務(wù)提供方式,以鴻蒙萬能卡片等多種呈現(xiàn)形態(tài), 向用戶提供更輕量化的服務(wù)。具有即用即走、信息外顯、服務(wù)直達(dá)的特性。

萬能卡片(以下簡稱“卡片”)是一種界面展示形式,可以將應(yīng)用的重要信息或操作前置到卡片,以達(dá)到服務(wù)直達(dá)、減少體驗(yàn)層級的目的。卡片常用于嵌入到其他應(yīng)用(當(dāng)前卡片使用方只支持系統(tǒng)應(yīng)用,如桌面)中作為其界面顯示的一部分,并支持拉起頁面、發(fā)送消息等基礎(chǔ)的交互功能。

下面是我們開發(fā)卡片時(shí)候的實(shí)現(xiàn)原理

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

這里涉及的幾個(gè)知識點(diǎn)給大家介紹一下

  • 卡片使用方:顯示卡片內(nèi)容的宿主應(yīng)用,控制卡片在宿主中展示的位置。
  • 卡片提供方:提供卡片顯示內(nèi)容的應(yīng)用,控制卡片的顯示內(nèi)容、控件布局以及控件點(diǎn)擊事件。
  • 卡片管理服務(wù):用于管理系統(tǒng)中所添加卡片的常駐代理服務(wù)。
  • 卡片渲染服務(wù):用于管理卡片渲染實(shí)例,渲染實(shí)例與卡片使用方上的卡片組件一一綁定。

ArkTS卡片提供了postCardAction()接口用于卡片內(nèi)部和提供方應(yīng)用間交互,當(dāng)前支持router、message和call三種類型的事件,僅在卡片中可以調(diào)用。這個(gè)我們在查詢油價(jià),以及處理message跳轉(zhuǎn)的時(shí)候會(huì)用到。大家繼續(xù)往后看就可以。

1、油價(jià)查詢(2*2)

這里我們需要學(xué)習(xí)的知識點(diǎn)在于卡片的創(chuàng)建,以及卡片數(shù)據(jù)如何交互。

創(chuàng)建ArkTS卡片有兩種方式:

  • 通過在”entry“目錄右鍵單擊“New > Service Widget”創(chuàng)建卡片。
  • 通過在”entry > src/main/ets > widget > pages“目錄右鍵單擊“New > ArkTS File”創(chuàng)建文件,并在卡片配置文件form_config.json中配置卡片信息。

使用第二種方式創(chuàng)建卡片,在”entry > src/main/ets > widget > pages“目錄右鍵單擊“New > ArkTS File”創(chuàng)建RubbishWidgetCard.ets文件,接著打開"entry > src/main/resources > base > profile"目錄下的form_config.json文件,配置名稱為rubbish的2*2卡片

這樣的話,我們的卡片就算創(chuàng)建完成了,

Column() {
      Row() {
        Image($r("app.media.rubbish")).width(this.Image_WIDTH_PERCENT).margin({
          right: 5
        })
        Text(this.TITLE)
          .fontSize($r('app.float.font_size'))
          .fontWeight(FontWeight.Bold)
          .fontColor($r('app.color.item_title_font'))
      }
    }
    .width(this.FULL_WIDTH_PERCENT)
    .backgroundColor($r("app.color.emuiLow4_alpha"))

    .height(this.FULL_HEIGHT_PERCENT)
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
      postCardAction(this, {
        "action": this.ACTION_TYPE,
        "abilityName": this.ABILITY_NAME,
        "params": {
          "targetPage": this.MESSAGE
        }
      });
    })
  }

但是要實(shí)現(xiàn)卡片數(shù)據(jù)的更新。

ArkTS卡片框架提供了updateForm()接口和requestForm()接口主動(dòng)觸發(fā)卡片的頁面刷新。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

接口

是否系統(tǒng)能力

約束

updateForm

1. 提供方調(diào)用。 2. 提供方僅允許刷新自己的卡片,其他提供方的卡片無法刷新。

requestForm

1. 使用方調(diào)用。 2. 僅允許刷新添加到當(dāng)前使用方的卡片,添加到其他使用方的卡片無法刷新。

卡片中需要使用@LocalStorageProp裝飾器接收。

@LocalStorageProp("puzzles") puzzles: Array<Array<number>> = [];
@LocalStorageProp("answers") answers: Array<Array<Array<number>>> = [];

然后,我們以更新深圳的天氣為例,在/src/main/ets/entryformability/EntryFormAbility.ts寫寫對應(yīng)的請求事件。

upData(formId :string){
    let formInfo = formBindingData.createFormBindingData({
      'text': '刷新中...'
    })
    formProvider.updateForm(formId, formInfo)
    console.info('Result:的結(jié)果' + JSON.stringify(formId));
    let httpRequest = http.createHttp();
    httpRequest.request(Constants.OILSERVER, {
      method: http.RequestMethod.GET,
      readTimeout: Constants.HTTP_READ_TIMEOUT,
      connectTimeout: Constants.HTTP_READ_TIMEOUT
    , extraData: {
        'province': "深圳",
        'app_id': Constants.APPID,
        'app_secret': Constants.APPSECRET

      },
    }, (err, data) => {
      if (!err) {
        // data.result為HTTP響應(yīng)內(nèi)容,可根據(jù)業(yè)務(wù)需要進(jìn)行解析
        console.info('Result:的結(jié)果' + JSON.stringify(data.result));
        let OilModel: OilModel = JSON.parse(data.result.toString())
        // 注意:FormExtensionAbility在觸發(fā)生命周期回調(diào)時(shí)被拉起,僅能在后臺存在5秒
        // 建議下載能快速下載完成的小文件,如在5秒內(nèi)未下載完成,則此次網(wǎng)絡(luò)圖片無法刷新至卡片頁面上
        let formData = {
          'oil': OilModel.data,
          'loaded': true,
          "time": getTime()

        };
        let formInfo = formBindingData.createFormBindingData(formData)
        formProvider.updateForm(formId, formInfo).then((data) => {
          console.info('FormAbility updateForm success.' + JSON.stringify(data));
        }).catch((error) => {
          console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
        })
        // 當(dāng)該請求使用完畢時(shí),調(diào)用destroy方法主動(dòng)銷毀
        httpRequest.destroy();
      } else {
        console.info('error:' + JSON.stringify(err));
        // 取消訂閱HTTP響應(yīng)頭事件
        httpRequest.off('headersReceive');
        // 當(dāng)該請求使用完畢時(shí),調(diào)用destroy方法主動(dòng)銷毀
        httpRequest.destroy();
      }
    }

    );
  }

然后我們在onUpdateForm中去調(diào)用就可以啦。

onUpdateForm(formId) {
    this.upData(formId)

    // Called to notify the form provider to update a specified form.
  }

這樣我們就完成了對油價(jià)的查詢。

這里我們主要了解的就是對卡片事件能力的處理。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

接口定義:postCardAction(component: Object, action: Object): void

接口參數(shù)說明:

參數(shù)名

參數(shù)類型

必填

參數(shù)描述

component

Object

當(dāng)前自定義組件的實(shí)例,通常傳入this。

action

Object

action的具體描述,詳情見下表。

action參數(shù)說明:

Key

Value

樣例描述

“action”

string

action的類型,支持三種預(yù)定義的類型: - “router”:跳轉(zhuǎn)到提供方應(yīng)用的指定UIAbility。 - “message”:自定義消息,觸發(fā)后會(huì)調(diào)用提供方FormExtensionAbility的onFormEvent()生命周期回調(diào)。 - “call”:后臺啟動(dòng)提供方應(yīng)用。觸發(fā)后會(huì)拉起提供方應(yīng)用的指定UIAbility(僅支持launchType為singleton的UIAbility,即啟動(dòng)模式為單實(shí)例的UIAbility),但不會(huì)調(diào)度到前臺。提供方應(yīng)用需要具備后臺運(yùn)行權(quán)限(ohos.permission.KEEP_BACKGROUND_RUNNING)。

“bundleName”

string

“router” / “call” 類型時(shí)跳轉(zhuǎn)的包名,可選。

“moduleName”

string

“router” / “call” 類型時(shí)跳轉(zhuǎn)的模塊名,可選。

“abilityName”

string

“router” / “call” 類型時(shí)跳轉(zhuǎn)的UIAbility名,必填。

“params”

Object

當(dāng)前action攜帶的額外參數(shù),內(nèi)容使用JSON格式的鍵值對形式。“call” 類型時(shí)需填入?yún)?shù)’method’,且類型需要為string類型,用于觸發(fā)UIAbility中對應(yīng)的方法,必填。

(1)通過message事件刷新卡片內(nèi)容

實(shí)現(xiàn)功能:在卡片上實(shí)現(xiàn)當(dāng)前城市的油價(jià)查詢,在頁面里實(shí)現(xiàn)對各個(gè)城市油價(jià)的查詢

主要技術(shù),通過message事件刷新卡片內(nèi)容,在卡片頁面中可以通過postCardAction接口觸發(fā)message事件拉起FormExtensionAbility,然后由FormExtensionAbility刷新卡片內(nèi)容,展示油價(jià)信息

.onClick(() => {
            postCardAction(this, {
              'action': 'message',
              'params': {
                'info': 'refreshImage'
              }
            });
          })

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

2、垃圾分類(1*2)

這里實(shí)現(xiàn)的功能是點(diǎn)擊卡片之后,進(jìn)入垃圾分類查詢頁的詳情。輸入物品名稱。就可以查看具體的垃圾分類信息。

(1)使用router事件跳轉(zhuǎn)到指定UIAbility

.onClick(() => {
  postCardAction(this, {
   'action': 'router',
    'abilityName': 'EntryAbility',
    "params": {
      "targetPage": this.MESSAGE
    }
  });
})

然后我們在src/main/ets/entryability/EntryAbility.ts中處理對應(yīng)的邏輯。

onCreate(want) {


  console.info("onCreate want:" + JSON.stringify(want));
  if (want.parameters.params !== undefined) {
    let params = JSON.parse(want.parameters.params);
    hilog.info(0x0000, 'tonCreate router targetPage', '%{public}s', params.targetPage)
    console.info("onCreate router targetPage:" + params.targetPage);
    selectPage = params.targetPage;
  }
}

如果UIAbility已在后臺運(yùn)行,在收到Router事件后會(huì)觸發(fā)onNewWant生命周期回調(diào)。

onNewWant(want, launchParam) {
  console.info("onNewWant want:" + JSON.stringify(want));
  if (want.parameters.params !== undefined) {
    let params = JSON.parse(want.parameters.params);
    hilog.info(0x0000, 'tonCreate router targetPage', '%{public}s', params.targetPage)

    console.info("onNewWant router targetPage:" + params.targetPage);
    console.info("獲取的 params.targetPage是" + params.targetPage);
    if (params.dimension !== undefined && params.dimension != null) {
      AppStorage.Set<string>('message', params.dimension);
      console.info("保存的 params.targetPage是" + params.targetPage);
    }

    selectPage = params.targetPage;


  }
  if (currentWindowStage != null) {
    this.onWindowStageCreate(currentWindowStage);
  }
}

根據(jù)傳遞的targetPage不同,選擇拉起不同的頁面。

onWindowStageCreate(windowStage: Window.WindowStage) {
  let targetPage;

  switch (selectPage) {
    case "MainPage":
      targetPage = "pages/MainPage";
      break;
    default:
      targetPage = 'pages/LoginPage';
  }
  if (currentWindowStage === null) {
    currentWindowStage = windowStage;
  }
  windowStage.loadContent(targetPage, (err, data) => {
    if (err && err.code) {
      console.info('Failed to load the content. Cause: %{public}s', JSON.stringify(err));
      return;
    }
  });
}

這樣我們就完成了跳轉(zhuǎn)。

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

3、當(dāng)前定位(2*2)

點(diǎn)擊卡片之后,進(jìn)入定位展示的詳情頁,展示當(dāng)前的詳細(xì)定位。

主要技術(shù),動(dòng)態(tài)權(quán)限的獲取。

(1)動(dòng)態(tài)權(quán)限獲取

首先需要在module.json中聲明對應(yīng)權(quán)限

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "ohos.permission.MEDIA_LOCATION",
      },
      {
        "name": 'ohos.permission.APPROXIMATELY_LOCATION'
      },
      {
        "name": 'ohos.permission.LOCATION'
      }
    ],

然后在ets/entryability/EntryAbility.ts中添加動(dòng)態(tài)權(quán)限的申請。

let AtManager = abilityAccessCtrl.createAtManager();
    AtManager.requestPermissionsFromUser(this.context, [  'ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION']).then((data) => {
      hilog.info(0x0000, 'testTag', '%{public}s', 'request permissions from user success' + data);
    }).catch((err) => {
      hilog.error(0x0000, 'testTag', 'Failed to request permissions from user. Cause: %{public}s', JSON.stringify(err) ?? '');
    });
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');

然后我們編寫卡片代碼。

Column() {
      Text("你想知道")
        .fontSize($r('app.float.title_immersive_font_size'))
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .fontColor($r('app.color.text_font_color'))
        .maxLines(this.MAX_LINES)
      Text("你當(dāng)前的位置嗎")
        .fontSize("14fp")
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .fontColor($r('app.color.text_font_color'))
        .maxLines(this.MAX_LINES)
    }
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
    .padding($r('app.float.column_padding'))

    .width(this.FULL_WIDTH_PERCENT)
    .height(this.FULL_HEIGHT_PERCENT)
    .backgroundColor($r('app.color.emuiLow2_alpha'))
    .onClick(() => {
      postCardAction(this, {
        "action": this.ACTION_TYPE,
        "abilityName": this.ABILITY_NAME,
        "params": {
          "targetPage": this.MESSAGE
        }
      });
    })
  }

運(yùn)行之后的效果:

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū) 鴻蒙入門開發(fā)教程:一文帶你詳解工具箱元服務(wù)的開發(fā)流程-開源基礎(chǔ)軟件社區(qū)

八、總結(jié)

本文我們從元服務(wù)的基本概念,到我們實(shí)用小工具的項(xiàng)目開發(fā),技術(shù)剝析,完整的了解了端元一體化開發(fā)元服務(wù),以及如何在元服務(wù)中集成華為認(rèn)證服務(wù),到最后完成油價(jià)查詢功能在卡片上及時(shí)顯示,定位在卡片上實(shí)時(shí)刷新。以及點(diǎn)擊卡片分類,還可以進(jìn)入詳情頁查詢更多物品的垃圾屬性,以及動(dòng)態(tài)權(quán)限的獲取。

你可以學(xué)到的有:

  • 了解元服務(wù)的基本概念
  • 使用端云一體化開發(fā)、開發(fā)云函數(shù)、開發(fā)云數(shù)據(jù)庫,集成華為認(rèn)證服務(wù)。
  • 使用FormExtensionAbility創(chuàng)建、更新、刪除元服務(wù)卡片。
  • 使用router、message和call三種類型的事件,處理對應(yīng)邏輯。

也可點(diǎn)擊元服務(wù)官網(wǎng),了解更多信息。

想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:

51CTO 開源基礎(chǔ)軟件社區(qū)

https://ost.51cto.com

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-08-07 13:29:49

開發(fā)鴻蒙

2021-05-29 10:11:00

Kafa數(shù)據(jù)業(yè)務(wù)

2015-05-27 14:26:05

2022-05-16 10:49:28

網(wǎng)絡(luò)協(xié)議數(shù)據(jù)

2025-04-09 08:25:20

2024-10-08 08:52:59

2024-06-27 10:50:01

2011-11-16 13:58:12

Adobe AIR

2022-05-11 11:54:55

Http傳送協(xié)議

2010-01-25 14:04:17

Android Wid

2023-07-31 08:18:50

Docker參數(shù)容器

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2018-11-13 09:56:52

TomcatServerWeb應(yīng)用服務(wù)器

2021-06-23 16:05:05

鴻蒙HarmonyOS應(yīng)用

2022-11-09 09:15:31

ProtoBufGo語言

2022-12-20 07:39:46

2023-11-20 08:18:49

Netty服務(wù)器

2023-12-21 17:11:21

Containerd管理工具命令行

2020-05-20 14:19:47

滴滴開源工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲欧洲中文 | 日韩一级欧美一级 | 91精品在线看 | 九九热免费视频在线观看 | 久久99蜜桃综合影院免费观看 | 秋霞在线一区二区 | 国产一区二区三区在线视频 | 国产精品视频999 | 久久成人免费视频 | 亚洲精品高清视频在线观看 | 综合成人在线 | 国产精品视频区 | 国产高清精品在线 | 成人黄色在线 | 天天操天天摸天天爽 | 亚洲综合久久久 | 中文字幕在线观看第一页 | 亚洲精品久久久久久一区二区 | 男女久久久 | 国产不卡一区在线观看 | 国产日韩欧美激情 | 精品一区二区久久久久久久网站 | 亚洲美女在线一区 | 国产激情一区二区三区 | 久久999 | 精品久久国产 | 亚洲福利一区二区 | 国产一级片在线观看视频 | 一区二区成人 | 一区二区视频在线观看 | 国产高清视频一区二区 | 色又黄又爽网站www久久 | 91精品www| 国产成人短视频在线观看 | 午夜精品久久久久久久久久久久 | 国产精品国产自产拍高清 | 精品96久久久久久中文字幕无 | 91国内精品久久 | 国产成人精品久久 | 久草视频在线播放 | 91精品久久久久久久久久 |