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