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);
    }

相关推荐
三体世界22 分钟前
Qt从入门到放弃学习之路(1)
开发语言·c++·git·qt·学习·前端框架·编辑器
悟能不能悟29 分钟前
jdk25结构化并发和虚拟线程如何配合使用?有什么最佳实践?
java·开发语言
柠檬071139 分钟前
MATLAB相机标定入门:Camera Calibration工具包详解
开发语言·数码相机·matlab
卓码软件测评1 小时前
借助大语言模型实现高效测试迁移:Airbnb的大规模实践
开发语言·前端·javascript·人工智能·语言模型·自然语言处理
熙客1 小时前
Java8:Lambda表达式
java·开发语言
小咕聊编程1 小时前
【含文档+PPT+源码】基于java web的篮球馆管理系统系统的设计与实现
java·开发语言
我狸才不是赔钱货2 小时前
Python的“环境之殇”:从Venv到Conda的终极抉择
开发语言·python·conda
游戏开发爱好者82 小时前
iOS 26 iPhone 使用记录分析 多工具组合构建全方位设备行为洞察体系
android·ios·小程序·uni-app·cocoa·iphone·webview
努力进修2 小时前
Rust 语言入门基础教程:从环境搭建到 Cargo 工具链
开发语言·后端·rust
杯莫停丶7 小时前
设计模式之:模板模式
开发语言·设计模式