一、開發環境
系統版本: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定制系統組合按鍵(二)