设备上硬件按键。除了 Home ,Menu,Back ,按键。
还有其他按键。
如:
F1 按键 ,F2按键。
监听F1,和F2的按键。
可以在以下文件查看,记录对应的KeyCode
QSSI.13/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
代码如下:
@Overridepublic 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) {// F2String 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) {// F1String 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
代码如下:
<PreferenceCategoryandroid:key="keyboards_category"android:title="@string/keyboard_and_input_methods_category"><Preferenceandroid:key="virtual_keyboard_pref"android:title="@string/virtual_keyboard_category"android:fragment="com.android.settings.inputmethod.AvailableVirtualKeyboardFragment"settings:keywords="@string/keywords_virtual_keyboard"/><Preferenceandroid:key="physical_keyboard_pref"android:title="@string/physical_keyboard_title"android:summary="@string/summary_placeholder"android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment"/><!-- 修改这里 --><Preferenceandroid: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
@Overridepublic 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);}//增加以下代码@Overridepublic boolean onPreferenceTreeClick(Preference preference) {if (TextUtils.equals("function_keyboard_pref", preference.getKey())) {FunctionKeySettingActivity.start(getActivity());return true;}return super.onPreferenceTreeClick(preference);}@Overridepublic 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);}