当前位置: 首页 > article >正文

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


http://www.kler.cn/a/537097.html

相关文章:

  • anaconda中可以import cv2,但是notebook中cv2 module not found
  • 《深度揭秘LDA:开启人工智能降维与分类优化的大门》
  • 4.攻防世界 unseping
  • ElasticSearch入门
  • 【MySQL】centos 7 忘记数据库密码
  • Django框架丨从零开始的Django入门学习
  • 2025.2.7
  • 多数据源配置及使用,在同一个方法下切换数据源。
  • 基于JUnit4和JUnit5配合例子讲解JUnit的两种运行方式
  • 笔记本电脑屏幕泛白问题解决详解(AMD显卡)
  • .NET 8 WebAPI文件下载包含断点续传和取消下载
  • STM32 CUBE Can调试
  • (11)gdb 笔记(4):设置执行方向 set exec-direction,
  • OpenCV:图像修复
  • RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)
  • CSS 伪类(Pseudo-classes)的详细介绍
  • Java基础学习笔记-封装
  • Python在数据科学中的高效应用:从数据处理到模型部署的实战指南
  • 高效运维!K8s 多节点自动安全排空
  • 为多个GitHub账户配置SSH密钥
  • PostgreSQL 中的 EXTRACT 函数_操作日期
  • 服务器磁盘高占用排查
  • Qt 数据库SQLite 使用【01】基本功能
  • Lua中文语言编程源码-第十一节,其它小改动汉化过程
  • Android studio 创建aar包给Unity使用
  • 使用 Axios ——个人信息修改