Pergunta

Ler alguns artigos me disse que as teclas macias variam entre os dispositivos. Alguns dizem -6 ou -21 para a chave macia esquerda e -7 ou -22 para a chave suave direita. Dada essa situação, existe algum bom invólucro ou função ou prática recomendada para lidar com isso corretamente?

Se não for possível para todos os dispositivos, qual é a melhor maneira de suportar a maioria dos dispositivos? com menor ou nenhum hack?

Foi útil?

Solução

Para dar uma idéia do escopo do problema, dê uma olhada nisso tabela de códigos -chave.

A abordagem de Omermuhammed é boa se você puder variar o conteúdo JAD, dependendo do aparelho de destino, por exemplo, analisando o campo de cabeçalho do agente do usuário em uma solicitação de download de um navegador da Web em manutenção.

Se você não conseguir identificar o aparelho até que o aplicativo tenha sido entregue, poderá se olhar para algo como isto Isso basicamente determina o aparelho do host no tempo de execução e define os mapeamentos de código de chave adequadamente. Parece complicado para mim, no entanto.

Por fim, se o seu aplicativo usar um subconjunto de códigos, você poderia Ser capaz de se safar de listas codificadas -para alguns códigos, não há ou poucas colisões (a esquerda geralmente é -3 ou -61, e esses códigos geralmente não significam outra coisa). Novamente, não é uma abordagem ideal.

Recursos finais sugeridos para você: Wurfl ou seqüências de agentes do usuário, e o J2Mepolish Banco de dados de dispositivos para códigos de chave do dispositivo.

Outras dicas

A maneira mais fácil que encontrei foi configurá-lo no código com os valores recomendados com base no padrão ITU-T e substituí-lo com um parâmetro JAD. Portanto, para qualquer aplicativo, ele procurará existência do parâmetro JAD no horário de inicialização do aplicativo e o definirá, caso contrário, usará os valores padrão.

Eu usei essas técnicas e técnicas semelhantes para escrever aplicativos que podem ser portados rapidamente, e esse processo geralmente é bem conhecido.

Tem que discordar completamente de Martin Clayton acima, algo semelhante a este método de identificar aparelhos de host no tempo de execução é absolutamente a maneira certa de lidar com esse problema. E incluir uma classe padrão para fazer isso para você é muito menos complicada do que falir com vários Jads/Jars IMO.

Este é o método que eu criei, que usa códigos -chave e nomes de chave. Eu escrevi esse código há cerca de 10 anos e, naquela época, ele apoiava a maioria dos dispositivos. (Uma exceção que encontrei, no entanto, foram alguns modelos sagem que têm o -6 e -7 Códigos -chave de outra maneira! Mas você provavelmente poderia contornar isso usando os nomes de chave novamente - mas pode precisar obter o agente do usuário também.)

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

    }

Código atualizado, com base em 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;
    }

}`

O MIDP define a seguinte constante para as teclas de um teclado ITU-T padrão: key_num0, key_num1, key_num2, key_num3, key_num4, key_num5, key_num6, key_num7, key_num8, key_num9, key_pound e key_star. Os aplicativos não devem depender da presença de códigos de chave adicionais. Em particular, superior e minúsculo ou caracteres gerados pressionando uma tecla várias vezes não são suportados por eventos de chave de baixo nível. Um "nome" atribuído à chave pode ser consultado usando o método getKeyName ().

AFAIR O método getKeyName retornou o mesmo na maioria dos telefones, por isso foi bastante confiável, mas eu não escrevi nada no J2ME há cerca de 2 anos atrás, para que minha memória possa fazer truques. (Você foi avisado)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top