Pregunta

Al leer algunos artículos, me dijo que las teclas programables varían entre dispositivos.Algunos dicen -6 o -21 para la tecla programable izquierda y -7 o -22 para la tecla programable derecha.Dada esta situación, ¿existe algún buen contenedor, función o mejor práctica para manejarlo correctamente?

Si no es posible para TODOS los dispositivos, ¿cuál es la mejor manera de admitir la mayoría de los dispositivos?¿Con un truco menor o sin ningún truco?

¿Fue útil?

Solución

Para darle una idea del alcance del problema, eche un vistazo a esto mesa de códigos clave.

El enfoque de Omermuhammed es bueno si puede variar el contenido de JAD dependiendo del teléfono de destino, por ejemplo, mirando el campo de encabezado de agente de usuario en una solicitud de descarga de un navegador web a mano.

Si no puede identificar el teléfono hasta que se haya entregado la aplicación, podría ver algo como este Eso básicamente determina el teléfono host en el momento de ejecución y establece las asignaciones de código clave adecuadamente. Sin embargo, me parece engorroso.

Por último, si su aplicación usa un subconjunto de códigos mayo Poder escapar con listas codificadas: para algunos códigos no hay o pocas colisiones (la izquierda generalmente es -3 o -61, y esos códigos generalmente no significan algo más). De nuevo, no es un enfoque ideal.

Recursos finales sugeridos para usted: wurfl o cadenas de agentes de usuario y el J2mepolish Base de datos de dispositivos para códigos de teclas de dispositivo.

Otros consejos

La forma más sencilla que encontré fue configurarlo en código con los valores recomendados según el estándar ITU-T y anularlo con un parámetro jad.Entonces, para cualquier aplicación determinada, buscará la existencia del parámetro jad en el momento de inicio de la aplicación y lo configurará; de lo contrario, utilizará los valores predeterminados.

He utilizado estas y otras técnicas similares para escribir aplicaciones que se puedan migrar rápidamente, y este proceso es generalmente bien conocido.

Tengo que estar en desacuerdo completamente con Martin Clayton arriba, algo similar a este método de identificar los teléfonos del host en tiempo de ejecución es absolutamente la forma correcta de lidiar con este problema. E incluir una clase estándar para hacer esto por usted es mucho menos engorrosa que fafar con múltiples jads/frascos en mi opinión.

Este es el método que he creado, que utiliza códigos clave y nombres de claves. Escribí este código hace unos 10 años y en ese entonces admitía la mayoría de los dispositivos. (Una excepción que encontré, sin embargo, fueron algunos modelos de Sagem que tienen el -6 y -7 Códigos clave al revés! Pero probablemente podría volver a trabajar con eso usando los nombres clave nuevamente, pero es posible que también deba obtener el agente de usuario).

    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 actualizado, basado en 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 define la siguiente constante para las teclas de un teclado ITU-T estándar: Key_Num0, Key_Num1, Key_Num2, Key_Num3, Key_Num4, Key_Num5, Key_Num6, Key_Num7, Key_num8, Key_num9, Key_pound y Key_star. Las aplicaciones no deben confiar en la presencia de códigos clave adicionales. En particular, los personajes superiores y minúsculas generados al presionar una tecla varias veces no son compatibles con eventos de teclas de bajo nivel. Se puede consultar un "nombre" asignado a la clave utilizando el método getKeyName ().

Afair El método GetKeyName regresó igual en la mayoría de los teléfonos, por lo que fue bastante confiable, pero no he escrito nada en J2ME desde hace unos 2 años, por lo que mi memoria podría jugar trucos (se ha advertido)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top