一、开发环境
系统版本: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定制系统组合按键(二)