J2ME Soft Key Wrapper - PullRequest
       14

J2ME Soft Key Wrapper

5 голосов
/ 15 ноября 2009

Читая некоторые статьи, сказали, что софт-клавиши у разных устройств разные. Некоторые говорят -6 или -21 для левой софт-клавиши и -7 или -22 для правой софт-клавиши. Учитывая эту ситуацию, есть ли какая-нибудь хорошая обертка или функция или лучшая практика для правильной обработки?

Если это невозможно для ВСЕХ устройств, каков наилучший способ поддержки большинства устройств? с незначительным или вообще без взлома?

Ответы [ 5 ]

4 голосов
/ 16 ноября 2009

Самым простым способом, который я нашел, было установить его в коде с рекомендуемыми значениями на основе стандарта ITU-T и переопределить его параметром jad. Таким образом, для любого данного приложения оно будет искать наличие параметра jad во время запуска приложения и устанавливать его, в противном случае оно будет использовать значения по умолчанию.

Я использовал эти и аналогичные методы для написания приложений, которые можно быстро перенести, и этот процесс в целом хорошо известен.

4 голосов
/ 16 ноября 2009

Чтобы понять суть проблемы, взгляните на эту таблицу кодов клавиш.

Подход Омермухаммеда хорош, если вы можете изменять содержимое JAD в зависимости от целевой трубки, например, просматривая поле заголовка user-agent в запросе на загрузку из веб-браузера на телефоне.

Если вы не можете идентифицировать телефонную трубку до тех пор, пока приложение не будет доставлено, вы можете посмотреть на что-то вроде this , которое в основном определяет телефонную трубку хоста во время выполнения и соответственно устанавливает сопоставления кода ключа. Хотя мне это кажется громоздким.

Наконец, если ваше приложение использует подмножество кодов, вы можете быть в состоянии избежать неприятностей с жестко закодированными списками - для некоторых кодов нет или мало коллизий (обычно LEFT либо -3, либо 61, и эти коды обычно не означают что-то еще). Опять же, не идеальный подход.

Окончательные рекомендуемые ресурсы для вас: wurfl или строки пользовательских агентов и база данных устройств J2MEPolish для кодов ключей устройств.

0 голосов
/ 16 марта 2015

Это метод, который я создал, который использует коды ключей и имена ключей. Я написал этот код около 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;
    }

}`
0 голосов
/ 16 ноября 2009

Полностью не согласен с Мартином Клэйтоном, описанным выше, что-то похожее на этот метод идентификации телефонных трубок хоста во время выполнения - абсолютно верный способ решения этой проблемы. И включение одного стандартного класса, чтобы сделать это для вас, гораздо менее трудоемко, чем обход с несколькими JAD / JAR IMO.

0 голосов
/ 15 ноября 2009

MIDP определяет следующую константу для клавиш стандартной клавиатуры ITU-T: KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUMO, KEY_NEYO, KEY_P. Приложения не должны полагаться на наличие каких-либо дополнительных кодов клавиш. В частности, прописные и строчные буквы или символы, генерируемые при многократном нажатии клавиши, не поддерживаются событиями клавиши низкого уровня. «Имя», присвоенное клавише, можно запросить с помощью метода getKeyName ().

AFAIR метод getKeyName возвращался практически одинаково на большинстве телефонов, поэтому он был довольно надежным, но я не писал ничего в j2me примерно 2 года назад, поэтому моя память могла бы подшучивать. (Вы были предупреждены)

...