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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…