当前位置: 首页 > article >正文

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.lryc.cn/news/2395622.html

相关文章:

  • ORDER BY子句在一个 SQL 查询中只能出现一次
  • Spring Boot 3 整合 MQ 构建聊天消息存储系统
  • DeepSeek实战:打造智能数据分析与可视化系统
  • 非线性声学计算与强化学习融合框架:突破复杂环境人机交互的新技术
  • C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件
  • Flutter - 原生交互 - 相机Camera - 01
  • 湖北理元理律师事务所:个人债务管理的温度与精度
  • Compose原理 - 整体架构与主流程
  • 从0开始学vue:实现一个简单页面
  • 在机器视觉测量和机器视觉定位中,棋盘格标定如何影响精度
  • CppCon 2014 学习: C++ Test-driven Development
  • RAGflow详解及实战指南
  • JWT 不对外,Session ID 对外:构建安全可控的微服务认证架构
  • [Godot] 如何导出安卓 APK 并在手机上调试
  • React 路由管理与动态路由配置实战
  • ZYNQ sdk lwip配置UDP组播收发数据
  • 11.21 LangGraph多轮对话系统实战:三步构建高效信息整理引擎,效率提升300%!
  • 高光谱成像相机:基于高光谱成像技术的玉米种子纯度检测研究
  • Linux《文件系统》
  • NLP学习路线图(十六):N-gram模型
  • 【Python办公】将Excel表格转json(字典)数据-可自定义key和value
  • Java内存区域与内存溢出异常分析与解决
  • Python训练第四十天
  • 硬件实时时钟(RTC)
  • InternVL2.5-多模态大模型评估专业图片
  • 医疗数理范式化:从范式迁移到认知革命的深度解析
  • 图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
  • leetcode hot100 二叉树(一)
  • 【技术支持】安卓11开机启动设置
  • 现代数据湖架构全景解析:存储、表格式、计算引擎与元数据服务的协同生态