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

相关推荐
华梦岚1 小时前
F#语言的学习路线
开发语言·后端·golang
lly2024062 小时前
XML 元素:结构化数据的基石
开发语言
钟离墨笺2 小时前
【c++】四种类型转换形式
开发语言·c++
“抚琴”的人2 小时前
【C#零基础从入门到精通】(一)——了解C#
开发语言·c#
梅清瑶2 小时前
Powershell语言的数据库编程
开发语言·后端·golang
吴天德少侠2 小时前
设计模式中的关联和依赖区别
java·开发语言·设计模式
剑客狼心2 小时前
Android Studio:键值对存储sharedPreferences
android·ide·android studio·键值对存储
汤姆和杰瑞在瑞士吃糯米粑粑2 小时前
【C++学习篇】C++11
开发语言·c++
zjkzjk77112 小时前
C++ 左值引用 & 右值引用 && std::move()左值改右值 移动构造函数()
开发语言·c++
Thomas_YXQ2 小时前
Unity3D Shader 简析:变体与缓存详解
开发语言·前端·缓存·unity3d·shader