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

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

还有其他按键。

如:

F1 按键 ,F2按键。

监听F1,和F2的按键。

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

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

代码如下:

复制代码
 @Override
    public 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) {// F2
            String 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) {// F1
            String 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

代码如下:

复制代码
    <PreferenceCategory
        android:key="keyboards_category"
        android:title="@string/keyboard_and_input_methods_category">
        <Preference
            android:key="virtual_keyboard_pref"
            android:title="@string/virtual_keyboard_category"
            android:fragment="com.android.settings.inputmethod.AvailableVirtualKeyboardFragment"
            settings:keywords="@string/keywords_virtual_keyboard"/>

        <Preference
            android:key="physical_keyboard_pref"
            android:title="@string/physical_keyboard_title"
            android:summary="@string/summary_placeholder"
            android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment"/>

        <!-- 修改这里 -->
        <Preference
            android: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

复制代码
    @Override
    public 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);
    }

    //增加以下代码
    @Override
    public boolean onPreferenceTreeClick(Preference preference) {
        if (TextUtils.equals("function_keyboard_pref", preference.getKey())) {
            FunctionKeySettingActivity.start(getActivity());
            return true;
        }
        return super.onPreferenceTreeClick(preference);
    }

    @Override
    public 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);
    }

相关推荐
weixin_4604435625 分钟前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
Cc.Y4 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
阿森_dev4 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209994 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说4 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha4 小时前
Lambda 表达式和函数式接口
java·开发语言
小白学大数据4 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
大圣编蚕5 小时前
初探 NDK 的世界:从零开始理解 Android 原生开发
android
云贝贝贝5 小时前
MySQL 慢查询定位与索引优化实战
android
学逆向的5 小时前
win32注入代码
开发语言·网络安全·api·win32