J2me Soft Key Purper
Вопрос
Читая некоторые статьи, сказали мне, что мягкие клавиши варьируются между устройствами. Некоторые говорят -6 или -21 для левой мягкой клавиши и -7 или -22 для правого мягкого ключа. Учитывая эту ситуацию, есть ли хорошая обертка, функция или лучшая практика, чтобы правильно справиться с ней?
Если не возможно для всех устройств, как лучше всего поддерживать большинство устройств? с незначительным или вообще нет взлома?
Решение
Чтобы вы почувствовали, что сфера этой проблемы посмотрите на это стол ключевых кодов.
Подход Omermuhammed хорош, если вы можете различить контент JAD в зависимости от целевого телефона, например, просмотрев поле заголовка пользователя-агента в запросе загрузки из веб-браузера на руке.
Если вы не можете идентифицировать трубку до тех пор, пока приложение не будет доставлено, вы можете посмотреть на что -то вроде это Это в основном определяет телефон хоста во время выполнения и устанавливает соответствующие сопоставления ключевых кодов. Похоже на меня выглядит громоздко.
Наконец, если в вашем приложении используется подмножество кодов, вы май иметь возможность сойти с рук с твердыми списками -для некоторых кодов нет или мало столкновений (слева обычно -3 или -61, и эти коды обычно не значат что -то другое). Опять же, не идеальный подход.
Окончательные предложенные ресурсы для вас: Вурфл или строки пользовательского агента, и J2Mepolish База данных устройств для кодов ключей устройства.
Другие советы
Самый простой способ, который я обнаружил,-это установить его в коде с рекомендуемыми значениями на основе стандарта ITU-T и переопределить его параметром JAD. Таким образом, для любого данного приложения он будет искать существование параметра JAD во время запуска приложения и установить его, в противном случае он будет использовать значения по умолчанию.
Я использовал эти и аналогичные методы для написания приложений, которые могут быть быстро перенесены, и этот процесс в целом хорошо известен.
Придется полностью не согласиться с Мартином Клейтоном выше, что -то похожее на Этот способ Определение мобильных телефонов хоста во время выполнения - это абсолютно правильный способ решить эту проблему. И в том числе один стандартный класс, чтобы сделать это для вас, гораздо менее громоздкий, чем Faffing с несколькими Jads/Jars 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-TEP: KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUM9, KEY_POUND и KEY_STAR. Приложения не должны полагаться на наличие каких -либо дополнительных кодов ключей. В частности, в верхнем и нижнем регистре или символах, сгенерированных путем нажатия клавиши несколько раз, не поддерживаются событиями низкоуровневого клавиши. «Имя», назначенное ключу, может быть запрошено с помощью метода getKeyName ().
Метод GetKeyName вернулся на большинство телефонов, поэтому он был довольно надежным, но я ничего не написал в J2ME около 2 лет назад, так что моя память могла бы играть трюки. (Вы были предупреждены)