Android设置个性化按钮按键的快捷启动应用

devtools/2025/2/9 9:30:17/

设备上硬件按键。除了 Home ,Menu,Back ,按键。

还有其他按键。

如:

F1 按键 ,F2按键。

监听F1,和F2的按键。

可以在以下文件查看,记录对应的KeyCode

QSSI.13/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

代码如下:

 @Overridepublic long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,int policyFlags) {final boolean keyguardOn = keyguardOn();final int keyCode = event.getKeyCode();final int repeatCount = event.getRepeatCount();final int metaState = event.getMetaState();final int flags = event.getFlags();final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;final boolean canceled = event.isCanceled();final int displayId = event.getDisplayId();final long key_consumed = -1;final long key_not_consumed = 0;if (DEBUG_INPUT) {Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="+ repeatCount + " keyguardOn=" + keyguardOn + " canceled=" + canceled);}if (mKeyCombinationManager.isKeyConsumed(event)) {return key_consumed;}
.
.
.if (keyCode == 312) {// F2String value = getFunctoinSetting(F2_FUNCTION_KEY);String packagename = "org.codeaurora.snapcam";String mainClass = "com.android.camera.CameraLauncher";if (TextUtils.isEmpty(value)) {} else {String[] pls = value.split("-");packagename = pls[1];mainClass = pls[2];}Intent intent = new Intent();ComponentName launcher = new ComponentName(packagename, mainClass);intent.setComponent(launcher);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(intent);return key_consumed;} else if (keyCode == 311) {// F1String value = getFunctoinSetting(F1_FUNCTION_KEY);String packagename = "com.android.chrome";String mainClass = "com.google.android.apps.chrome.Main";if (TextUtils.isEmpty(value)) {} else {String[] pls = value.split("-");packagename = pls[1];mainClass = pls[2];}Intent intent = new Intent();ComponentName launcher = new ComponentName(packagename, mainClass);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setComponent(launcher);mContext.startActivity(intent);return key_consumed;}// Let the application handle the key.return key_not_consumed;}

对应的Setting界面也可以配置F1,F2的跳转App。

在Setting - System  - Language & input - 下面的 Physical keyboard 下面加  Function keys 选项。

/QSSI.13/packages/apps/Settings/res/xml/language_and_input.xml

代码如下:

    <PreferenceCategoryandroid:key="keyboards_category"android:title="@string/keyboard_and_input_methods_category"><Preferenceandroid:key="virtual_keyboard_pref"android:title="@string/virtual_keyboard_category"android:fragment="com.android.settings.inputmethod.AvailableVirtualKeyboardFragment"settings:keywords="@string/keywords_virtual_keyboard"/><Preferenceandroid:key="physical_keyboard_pref"android:title="@string/physical_keyboard_title"android:summary="@string/summary_placeholder"android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment"/><!-- 修改这里 --><Preferenceandroid:key="function_keyboard_pref"android:title="@string/function_keyboard_title"android:summary="@string/function_keyboard_summary"/></PreferenceCategory>

在QSSI.13/packages/apps/Settings/src/com/android/settings/language/LanguageAndInputSettings.java

    @Overridepublic void onResume() {super.onResume();// Hack to update action bar title. It's necessary to refresh title because this page user// can change locale from here and fragment won't relaunch. Once language changes, title// must display in the new language.final Activity activity = getActivity();if (activity == null) {return;}activity.setTitle(R.string.language_settings);}//增加以下代码@Overridepublic boolean onPreferenceTreeClick(Preference preference) {if (TextUtils.equals("function_keyboard_pref", preference.getKey())) {FunctionKeySettingActivity.start(getActivity());return true;}return super.onPreferenceTreeClick(preference);}@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);replaceEnterpriseStringTitle("language_and_input_for_work_category",WORK_PROFILE_KEYBOARDS_AND_TOOLS,R.string.language_and_input_for_work_category_title);replaceEnterpriseStringTitle("spellcheckers_settings_for_work_pref",SPELL_CHECKER_FOR_WORK,R.string.spellcheckers_settings_for_work_title);replaceEnterpriseStringTitle("user_dictionary_settings_for_work_pref",PERSONAL_DICTIONARY_FOR_WORK,R.string.user_dict_settings_for_work_title);}

FunctionKeySettingActivity 需要自己开发和实现。

通过保存F1,F2的跳转配置 和 获取在Setting里设置的配置

以下代码:

/*** save the packangename to the functionkey** @param key* @param value*/private void saveFunctionSetting(String key, String value) {
//        Settings.Global.getString(getContext().getContentResolver(), key);Settings.Global.putString(getContentResolver(), key, value);}private String getFunctoinSetting(String key) {return Settings.Global.getString(getContentResolver(), key);}


http://www.ppmy.cn/devtools/157314.html

相关文章

【AI应用】免费的文本转语音工具:微软 Edge TTS 和 开源版 ChatTTS 对比

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 我试用了下Edge TTS&#xff0c;感觉还不错&#xff0c;不过它不支持克隆声音&#xff08;比如自己的声音&#xff09; 微软 Edge TTS 和 开源版 ChatTTS 都是免费的 文本转语音&…

http状态码:请说说 503 Service Unavailable(服务不可用)的原因以及排查问题的思路

503 Service Unavailable&#xff08;服务不可用&#xff09; 是一种HTTP状态码&#xff0c;表示服务器当前无法处理请求&#xff0c;通常是由于临时性原因导致服务中断。以下是它的常见原因和排查思路&#xff1a; 一、503错误的常见原因 1. 服务器过载 场景&#xff1a;服务…

【真一键部署脚本】——一键部署deepseek

目录 deepseek一键部署脚本说明 0 必要前提 1 使用方法 1.1 使用默认安装配置 1.1 .1 使用其它ds模型 1.2 使用自定义安装 2 附录&#xff1a;deepseek模型手动下载 3 脚本下载地址 deepseek一键部署脚本说明 0 必要前提 linux环境 python>3.10 1 使用方法 1.1 …

基于FPGA的BT1120编解码

BT1120与BT656 类似 BT1120与BT656同类属于一个视频协议,两者无论从组成、协议、同步码以及传输过程都是十分相似: 1、两者都是以F(场)、V(帧)、H(消隐)、D(有效)来区分数据的内容。 2、两者的传输数据都采用一样的方式,即内同步传输数据。 3、两者都传输的数据都是…

SAP FICO科目辅助余额表开发说明书(包括测试样例,源代码仅作参考,不能保证一定可以运行

逻辑说明 筛选屏幕 科目辅助余额表 公司代码会计年度从期间至期间

嵌入式C语言:大小端详解

目录 一、大小端的概念 1.1. 大端序&#xff08;Big-endian&#xff09; 1.2. 小端序&#xff08;Little-endian&#xff09; 二、大小端与硬件体系的关系 2.1. 大小端与处理器架构 2.2. 大小端与网络协议 2.3. 大小端对硬件设计的影响 三、判断系统的大小端方式 3.1.…

前后端服务配置

1、安装虚拟机&#xff08;VirtualBox或者vmware&#xff09;&#xff0c;在虚拟机上配置centos(选择你需要的Linux版本)&#xff0c;配置如nginx服务器等 1.1 VMware 下载路径Sign In注册下载 1.2 VirtualBox 下载路径https://www.virtualbox.org/wiki/Downloads 2、配置服…

「全网最细 + 实战源码案例」设计模式——策略模式

核心思想 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;用于定义一系列算法或策略&#xff0c;将它们封装成独立的类&#xff0c;并使它们可以相互替换&#xff0c;而不影响客户端的代码&#xff0c;提高代码的可维护性和扩展性。 结构 …