J2ME Soft Key Wrapper
Читая некоторые статьи, мне сказали, что софт-клавиши у разных устройств разные. Некоторые говорят, что -6 или -21 для левой софт-клавиши и -7 или -22 для правой софт-клавиши. Учитывая эту ситуацию, есть ли какая-нибудь хорошая обертка или функция или лучшая практика, чтобы обращаться с ней должным образом?
Если это невозможно для ВСЕХ устройств, каков наилучший способ поддержки большинства устройств? с незначительным или вообще без взлома?
5 ответов
Чтобы понять суть проблемы, взгляните на эту таблицу кодов клавиш.
Подход Омермухаммеда хорош, если вы можете изменять содержимое JAD в зависимости от целевого телефона, например, просматривая поле заголовка user-agent в запросе на загрузку из веб-браузера на телефоне.
Если вы не можете идентифицировать телефонную трубку до тех пор, пока приложение не будет доставлено, вы можете посмотреть на что-то вроде этого, которое в основном определяет телефонную трубку хоста во время выполнения и соответственно устанавливает сопоставления кодов клавиш. Выглядит громоздко для меня, хотя.
Наконец, если ваше приложение использует подмножество кодов, вы можете избежать жестко закодированных списков - для некоторых кодов нет или мало коллизий (обычно LEFT -3 или -61, и эти коды обычно не делают значит что то другое). Опять же, не идеальный подход.
Окончательные предлагаемые ресурсы для вас: строки wurfl или user agent, а также база данных устройств J2MEPolish для кодов ключей устройств.
Самым простым способом, который я нашел, было установить его в коде с рекомендуемыми значениями, основанными на стандарте ITU-T, и переопределить его параметром jad. Таким образом, для любого данного приложения оно будет искать наличие параметра jad во время запуска приложения и устанавливать его, в противном случае оно будет использовать значения по умолчанию.
Я использовал эти и подобные методы для написания приложений, которые можно быстро перенести, и этот процесс в целом хорошо известен.
Вы должны полностью не согласиться с Мартином Клейтоном, описанным выше, что-то похожее на этот метод идентификации хост-телефонов во время выполнения - абсолютно верный способ решения этой проблемы. И включение одного стандартного класса, чтобы сделать это для вас, гораздо менее трудоемко, чем обход с несколькими JAD /JAR IMO.
Это метод, который я создал, который использует коды ключей и имена ключей. Я написал этот код около 10 лет назад, и тогда он поддерживал большинство устройств. (Однако одно исключение, которое я обнаружил, это некоторые модели Sagem, которые имеют -6
а также -7
коды клавиш наоборот! Но, возможно, вы могли бы обойти это снова, используя имена ключей, но вам может понадобиться и пользовательский агент.)
private static final int SOFT_BUTTON_KEY_CODE_UNDEFINED = -999;
private static int LEFT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private static int RIGHT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private boolean isLeftSoftButton(int keyCode) {
// Try the standard code
if (keyCode == -6) {
return true;
}
// Try the code we have already detected
else if (keyCode == LEFT_SOFT_BUTTON_KEY_CODE && LEFT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (LEFT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT1") || keyName.equals("LEFT SELECTION KEY") || keyName.equals("LEFT SOFTKEY") || keyName.equals("LEFT SOFT KEY") || keyName.equals("SOFTKEY 1") || keyName.equals("-6")) {
// It's the left soft button! So remember the code for next time...
LEFT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}
private boolean isRightSoftButton(int keyCode) {
// Try the standard code
if (keyCode == -7) {
return true;
}
// Try the code we have already detected
else if (keyCode == RIGHT_SOFT_BUTTON_KEY_CODE && RIGHT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (RIGHT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT2") || keyName.equals("RIGHT SELECTION KEY") || keyName.equals("RIGHT SOFTKEY") || keyName.equals("RIGHT SOFT KEY") || keyName.equals("SOFTKEY 4") || keyName.equals("SOFTKEY 2") || keyName.equals("-7")) {
// It's the right soft button! So remember the code for next time...
RIGHT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}
Обновленный код, основанный на http://www.iteye.com/topic/179073...
private static final int SOFT_BUTTON_KEY_CODE_UNDEFINED = -999;
private static int LEFT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private static int RIGHT_SOFT_BUTTON_KEY_CODE = SOFT_BUTTON_KEY_CODE_UNDEFINED;
private boolean isLeftSoftButton(int keyCode) {
// Try the standard codes
// standard || Motorola || Siemens || Motorola 2 || Motorola 1
if (keyCode == -6 || keyCode == -21 || keyCode == -1 || keyCode == -20 || keyCode == 21) {
return true;
}
// Try the code we have already detected
else if (keyCode == LEFT_SOFT_BUTTON_KEY_CODE && LEFT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (LEFT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT1") || keyName.equals("LEFT SELECTION KEY") || keyName.equals("LEFT SOFTKEY") || keyName.equals("LEFT SOFT KEY") || keyName.equals("SOFTKEY 1") || keyName.equals("-6")) {
// It's the left soft button! So remember the code for next time...
LEFT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}
private boolean isRightSoftButton(int keyCode) {
// Try the standard codes
// standard || Motorola || Siemens || Motorola 1
if (keyCode == -7 || keyCode == -22 || keyCode == -4 || keyCode == 22) {
return true;
}
// Try the code we have already detected
else if (keyCode == RIGHT_SOFT_BUTTON_KEY_CODE && RIGHT_SOFT_BUTTON_KEY_CODE != SOFT_BUTTON_KEY_CODE_UNDEFINED) {
return true;
}
// If we haven't yet detected the code...
else if (RIGHT_SOFT_BUTTON_KEY_CODE == SOFT_BUTTON_KEY_CODE_UNDEFINED) {
// try to detect it
String keyName = getKeyName(keyCode).toUpperCase();
if (keyName.equals("SOFT2") || keyName.equals("RIGHT SELECTION KEY") || keyName.equals("RIGHT SOFTKEY") || keyName.equals("RIGHT SOFT KEY") || keyName.equals("SOFTKEY 4") || keyName.equals("SOFTKEY 2") || keyName.equals("-7")) {
// It's the right soft button! So remember the code for next time...
RIGHT_SOFT_BUTTON_KEY_CODE = keyCode;
// Return true
return true;
}
else {
// keyName didn't match, so return false
return false;
}
}
else {
// keyCode didn't match
return false;
}
}`
MIDP определяет следующую константу для клавиш стандартной клавиатуры ITU-T: KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUM9, KEY_POUND и KEY_POUND. Приложения не должны полагаться на наличие каких-либо дополнительных кодов клавиш. В частности, прописные и строчные буквы или символы, генерируемые при многократном нажатии клавиши, не поддерживаются событиями клавиши низкого уровня. "Имя", присвоенное ключу, можно запросить с помощью метода getKeyName().
AFAIR метод getKeyName возвращался практически одинаково на большинстве телефонов, поэтому он был достаточно надежным, но я не писал ничего в j2me около 2 лет назад, поэтому моя память может играть хитрости (вы были предупреждены)