OpenHarmony定制系統組合按鍵(一)

一、開發環境

系統版本:OpenHarmony 4.0.10.13
設備平臺:rk3568
SDK版本:fullSDK 4.0.10.13
DevEco Studio版本:4.1.0.400

二、需求背景

定制OpenHarmony 系統組合按鍵功能,例如仿Android Power + VOL_Up組合鍵實現截屏功能

三、需求分析

查詢OpenHarmony API接口文檔,存在組合按鍵訂閱模塊,用于處理組合按鍵的訂閱
@ohos.multimodalInput.inputConsumer (組合按鍵)(系統接口)

在這里插入圖片描述

let leftAltKey = 2045;
let tabKey = 2049;
let keyOptions: inputConsumer.KeyOptions = {preKeys: [ leftAltKey ],finalKey: tabKey,isFinalKeyDown: true,finalKeyDownDuration: 0
};
let callback = (keyOptions: inputConsumer.KeyOptions) => {console.log(`keyOptions: ${JSON.stringify(keyOptions)}`);
}
try {inputConsumer.on("key", keyOptions, callback);
} catch (error) {console.log(`Subscribe failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}

通過此接口可訂閱特定的組合按鍵,觸發特定事件,包括但不限于:

A + B ==>截屏/打開設置/打開網頁/進入Launcher等等

為了更好的管理和分發系統全局組合按鍵事件,可通過創建一個系統服務應用,開機運行后在后臺注冊相關的組合按鍵。
本文首先介紹如何創建一個系統服務應用。

四、實現過程

創建工程

打開DevEco Studio
File > New > Create Project > Application >[OpenHarmony]Empty Ability > Next
在這里插入圖片描述
確認應用工程名、包名、SDK版本、Model > Next
在這里插入圖片描述

創建ServiceExtensionAbility

可參考:創建ServiceExtensionAbility
在工程entry/src/main/ets目錄創建services目錄,用于存放自定義ServiceExtensionAbility

ets > 鼠標右鍵 > New > Directory > services
在這里插入圖片描述
在新創建的services中創建自定義ServiceExtensionAbility
services > 鼠標右鍵 > New > ArkTs File > ServiceExtAbility
在這里插入圖片描述
ServiceExtAbility.ets內容為:

import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility';
import Want from '@ohos.app.ability.Want';
import hilog from '@ohos.hilog';
import rpc from '@ohos.rpc';const TAG: string = '[ServiceExtAbility]';
const DOMAIN_NUMBER: number = 0xFF00;class ServiceStub extends rpc.RemoteObject {constructor(des: string) {super(des);}
}export default class ServiceExtAbility extends ServiceExtensionAbility {onCreate(want: Want): void {let serviceExtensionContext = this.context;hilog.info(DOMAIN_NUMBER, TAG, `onCreate, want: ${want.abilityName}`);};onRequest(want: Want, startId: number): void {hilog.info(DOMAIN_NUMBER, TAG, `onRequest, want: ${want.abilityName}`);};onConnect(want: Want): rpc.RemoteObject {hilog.info(DOMAIN_NUMBER, TAG, `onConnect, want: ${want.abilityName}`);// 返回ServiceExtImpl對象,客戶端獲取后便可以與ServiceExtensionAbility進行通信return new ServiceStub('ServiceExtAbilityService');};onDisconnect(want: Want): void {hilog.info(DOMAIN_NUMBER, TAG, `onDisconnect, want: ${want.abilityName}`);};onDestroy(): void {hilog.info(DOMAIN_NUMBER, TAG, 'onDestroy');};
};

注冊ServiceExtensionAbility

在工程Module對應的module.json5配置文件中

  • 注冊ServiceExtensionAbility
  • type標簽需要設置為“service”
  • srcEntry標簽表示當前ExtensionAbility組件所對應的代碼路徑。
  • mianElement設置為ServiceExtAbility
    module.json5文件內容如下:
{"module": {"name": "entry","type": "entry","description": "$string:module_desc","mainElement": "ServiceExtAbility","deviceTypes": ["default","tablet"],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:icon","label": "$string:EntryAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}],"extensionAbilities": [{"name": "ServiceExtAbility","icon": "$media:icon","label": "$string:EntryAbility_label","description": "service","type": "service","exported": true,"srcEntry": "./ets/services/ServiceExtAbility.ets"}]}
}

構建和安裝hap

對應用進行自動簽名
File > Project Structure… > Project > Signing Configs > Automatically generate signature

獲取應用簽名指紋

#打開設備debug log
hdc shell param set persist.sys.hilog.debug.on true
hdc shell param set hilog.debug.on true 
hdc shell  hilog -b D# 過濾安裝hap時的finger信息
hdc shell "hilog |grep finger"

點擊DevEco Studio 運行按鈕,IDE會自動編譯和安裝hap包
在這里插入圖片描述
不出預料會安裝失敗,但hilog中會看到指紋信息,即
42BBCECD7084D3C605F9FAF53E61278DAC8D944175ADABBB49B507B09774F490

hdc shell "hilog |grep finger"
08-05 23:44:23.357   547 24958 D C02f00/HapVerify: GenerateFingerprint: fingerprint is : 42BBCECD7084D3C605F9FAF53E61278DAC8D944175ADABBB49B507B09774F490

配置特權文件install_list_capability.json

# 從設備導出配置文件
hdc shell mount -o remount,rw /
hdc file recv /system/etc/app/install_list_capability.json  C:\Users\xxx\Desktop

在install_list_capability.json 末尾配置

		...},{"bundleName": "com.example.myapplication","app_signature" : ["42BBCECD7084D3C605F9FAF53E61278DAC8D944175ADABBB49B507B09774F490"],"allowAppUsePrivilegeExtension": true,"allowAppDesktopIconHide": true,"singleton": true,"keepAlive": true}

替換install_list_capability.json并重啟

hdc shell mount -o remount,rw /
hdc file send C:\Users\xxx\Desktop\\install_list_capability.json /system/etc/app/install_list_capability.json

構建hap包

由于上面配置了應用為singleton安裝hap包,仍無法直接用IDE安卓,需將hap包推至設備通過bm命令安裝
Build > Build Hap(s)/APP(s) > Build Hap(s)
編譯完成后得到:entry/build/default/outputs/default/entry-default-signed.hap

# 將hap push至設備/data目錄
hdc file send D:\projects\DevEcoProjects\MyApplication\entry\build\default\outputs\default\entry-default-signed.hap /data#bm安裝hap
hdc shell bm install -p /data/entry-default-signed.hap -u 0#重啟設備
hdc shell reboot

校驗

重啟后可在IDE 看到demo的日志
在這里插入圖片描述
也可在設備進程中看到service被拉起

ps -A | grep myapplication

總結

通過本文你已經學會如何創建開機自啟后臺服務,后續將在此服務中訂閱組合按鍵,實現截屏、打開設置功能
OpenHarmony定制系統組合按鍵(二)

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

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

相關文章

相機定屏問題分析四:【cameraserver 最大request buffer超標】后置視頻模式預覽定屏閃退至桌面

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了:相機定屏問題分析三:【配流ConfigStream失敗】外屏打開相機視頻照片人像來回切換后,相機頁面卡死,點擊沒反應9055522 這一篇我們開始講: 相機定屏問題分析四:【cameraserver 最大request buffer超…

從 PyTorch 到 TensorFlow Lite:模型訓練與推理

一、方案介紹 研發階段:利用 PyTorch 的動態圖特性進行快速原型驗證,快速迭代模型設計。 靈活性與易用性:PyTorch 是一個非常靈活且易于使用的深度學習框架,特別適合研究和實驗。其動態計算圖特性使得模型的構建和調試變得更加直…

4.2.5 Spark SQL 分區自動推斷

在本節實戰中,我們學習了Spark SQL的分區自動推斷功能,這是一種提升查詢性能的有效手段。通過創建具有不同分區的目錄結構,并在這些目錄中放置JSON文件,我們模擬了一個分區表的環境。使用Spark SQL讀取這些數據時,Spar…

數據結構:導論

目錄 什么是“第一性原理”? 什么是“數據結構”? 數據結構解決的根本問題是什么? 數據結構的兩大分類 數據結構的基本操作 數據結構與算法的關系 學習數據結構的底層目標 什么是“第一性原理”? 在正式進入數據結構之前&…

汽車制造場景下Profibus轉Profinet網關核心功能與應用解析

在當今工業自動化的浪潮中,各種通訊協議層出不窮,而其中PROFIBUS與PROFINET作為兩種主流的工業通信標準,它們之間的轉換需求日益增長。特別是對于那些希望實現老舊設備與現代化網絡無縫對接的企業來說,一個高效、穩定的網關產品顯…

qt ubuntu 20.04 交叉編譯

一、交叉編譯環境搭建 1.下載交叉編譯工具鏈:https://developer.arm.com/downloads/-/gnu-a 可以根據自己需要下載對應版本,當前最新版本是10.3, 筆者使用10.3編譯后的glibc.so版本太高(glibc_2.3.3, glibc_2.3.4, glibc_2.3.5)…

在Babylon.js中創建3D文字:簡單而強大的方法

引言 在3D場景中添加文字是許多WebGL項目的常見需求。Babylon.js提供了多種創建3D文字的方法,其中使用TextBlock結合平面網格是一種簡單而高效的方式。本文將介紹如何使用Babylon.js的GUI系統在3D空間中創建美觀的文字效果。 方法概述 Babylon.js的GUI系統允許我…

油桃TV v20250519 一款電視端應用網站聚合TV播放器 支持安卓4.1

油桃TV v20250519 一款電視端應用網站聚合TV播放器 支持安卓4.1 應用簡介: 油桃TV是一款開源電視端應用網站聚合瀏覽器,它把大家常見需求的一些網站都整合到了這個應用上,并進行了電視端…

Perl單元測試實戰指南:從Test::Class入門到精通的完整方案

閱讀原文 前言:為什么Perl開發者需要重視單元測試? "這段代碼昨天還能運行,今天就出問題了!"——這可能是每位Perl開發者都經歷過的噩夢。在沒有充分測試覆蓋的情況下,即使是微小的改動也可能導致系統崩潰。單元測試正是解決這一痛點的最佳實踐,它能幫助我們在…

OpenCv高階(十三)——人臉檢測

文章目錄 前言一、人臉檢測—haar特征二、人臉檢測---級聯分類器1、級聯分類器2、如何訓練級聯分類器3、已存在的級聯分類器 三、代碼分析1、人臉檢測的簡單使用2、人臉微笑檢測(1) 初始化視頻源(2)主循環處理每一幀(3…

無線通信模塊簡介

QuecPython 是運行在無線通信模塊上的開發框架。對于首次接觸物聯網開發的用戶而言,無線通信模塊可能是一個相對陌生的概念。本文主要針對無線通信和蜂窩網絡本身,以及模塊的概念、特性和開發方式進行簡要的介紹。 無線通信和蜂窩網絡 物聯網對無線通信…

Unity 中實現首尾無限循環的 ListView

之前已經實現過: Unity 中實現可復用的 ListView-CSDN博客文章瀏覽閱讀5.6k次,點贊2次,收藏27次。源碼已放入我的 github,地址:Unity-ListView前言實現一個列表組件,表現方面最核心的部分就是重寫布局&…

【C++】 類和對象(上)

1.類的定義 1.1類的定義格式 ? class為定義類的關鍵字,后跟一個類的名字,{}中為類的主體,注意類定義結束時后?分號不能省 略。類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量;類中的函數稱為類的?法或 者成員函數。…

Transformer架構詳解:從Attention到ChatGPT

Transformer架構詳解:從Attention到ChatGPT 系統化學習人工智能網站(收藏):https://www.captainbed.cn/flu 文章目錄 Transformer架構詳解:從Attention到ChatGPT摘要引言一、Attention機制:Transformer的…

Rock9.x(Linux)安裝Redis7

💚提醒:1)注意權限問題 💚 查是否已經安裝了gcc gcc 是C語言編譯器,Redis是用C語言開發的,我們需要編譯它。 gcc --version如果沒有安裝gcc,那么我們手動安裝 安裝GCC sudo dnf -y install…

EasyExcel使用導出模版后設置 CellStyle失效問題解決

EasyExcel使用導出模版后在CellWriteHandler的afterCellDispose方法設置 CellStyle失效問題解決方法 問題描述:excel 模版塞入數據后,需要設置單元格的個性化設置時失效,本文以設置數據格式為例(設置列的數據展示時需要加上千分位…

【Day41】

DAY 41 簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化:調整一個批次的分布,常用與圖像數據特征圖:只有卷積操作輸出的才叫特征圖調度器:直接修改基礎學習率 卷積操作常見流程如下: 1. 輸入 → 卷積層 →…

Express教程【002】:Express監聽GET和POST請求

文章目錄 2、監聽post和get請求2.1 監聽GET請求2.2 監聽POST請求 2、監聽post和get請求 創建02-app.js文件。 2.1 監聽GET請求 1??通過app.get()方法,可以監聽客戶端的GET請求,具體的語法格式如下: // 1、導入express const express req…

C# 文件 I/O 操作詳解:從基礎到高級應用

在軟件開發中,文件操作(I/O)是一項基本且重要的功能。無論是讀取配置文件、存儲用戶數據,還是處理日志文件,C# 都提供了豐富的 API 來高效地進行文件讀寫操作。本文將全面介紹 C# 中的文件 I/O 操作,涵蓋基…

Vue-Router簡版手寫實現

1. 路由庫工程設計 首先,我們需要創建幾個核心文件來組織我們的路由庫: src/router/index.tsRouterView.tsRouterLink.tsuseRouter.tsinjectionsymbols.tshistory.ts 2. injectionSymbols.ts 定義一些注入符號來在應用中共享狀態: import…