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

相关推荐
yufei-coder2 分钟前
配置Next.js环境 使用vscode
开发语言·javascript·vscode·next.js
电科_银尘3 分钟前
【Matlab】-- 基于MATLAB的飞蛾扑火算法与反向传播算法的混凝土强度预测
开发语言·算法·matlab
二流小码农8 分钟前
鸿蒙开发:使用Rect绘制矩形
android·ios·harmonyos
wen__xvn27 分钟前
Codeforces Round 1014 (Div. 2)2092A - Kamilka and the Sheep c++
开发语言·c++·算法
编程之升级打怪1 小时前
自定义C语言变量转换库
c语言·开发语言
_乐多_1 小时前
python:将mp4视频快进播放,并保存新的视频
开发语言·python·音视频
haoshuai_1 小时前
第二次作业
android·adb
louisgeek1 小时前
Android 协变和逆变
android
Jason-河山1 小时前
如何使用Python爬虫获取1688商品评论?
开发语言·爬虫·python