J2ME Soft Key Wrapper

时间:2009-11-15 01:49:45

标签: java-me midp lcdui softkeys

阅读一些文章,告诉我软键在设备之间有所不同。 有人说左软键为-6或-21,右软键为-7或-22。 鉴于这种情况,是否有适当的包装或功能或最佳实践来妥善处理它?<​​/ p>

如果所有设备都不可用,那么支持大多数设备的最佳方式是什么?有轻微或没有黑客攻击?

5 个答案:

答案 0 :(得分:4)

我发现最简单的方法是使用基于ITU-T标准的推荐值在代码中进行设置,并使用jad参数覆盖它。因此,对于任何给定的应用程序,它将在应用程序启动时查找jad参数的存在并设置它,否则它将使用默认值。

我已经使用这些和类似的技术来编写可以快速移植的应用程序,这个过程通常是众所周知的。

答案 1 :(得分:4)

为了让您了解问题的范围,请查看此table个密码代码。

如果您能够根据目标手机改变JAD内容,例如通过查看来自手机网络浏览器的下载请求中的用户代理头字段,Omermuhammed的方法是一个很好的方法。

如果在应用程序交付之前无法识别手机,您可以查看this之类的内容,它基本上在运行时确定主机手机并适当设置键码映射。 虽然看起来很麻烦。

最后,如果您的应用程序使用代码子集,您可能能够使用硬编码列表 - 对于某些代码,没有或几乎没有冲突(LEFT通常为-3或-61,这些代码通常不代表其他东西)。再次,不是一个理想的方法。

最终为您建议的资源:wurfl或用户代理字符串,以及设备密钥代码的J2MEPolish设备数据库。

答案 2 :(得分:0)

必须完全不同意上面的Martin Clayton,类似于this method在运行时识别主机手机的方法绝对是处理这个问题的正确方法。包括一个标准类为你做这件事,比使用多个JAD / JAR IMO更加麻烦。

答案 3 :(得分:0)

这是我创建的方法,它使用密钥代码和密钥名称。我大约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;
    }

}`

答案 4 :(得分:-2)

  

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_STAR。应用程序不应依赖于任何其他密钥代码的存在。特别是,低级键事件不支持通过多次按键生成的大写和小写字符。可以使用getKeyName()方法查询分配给密钥的“名称”。

AFAIR getKeyName方法在大多数手机上都返回相同,所以它非常可靠,但是大约2年前我没有在j2me中写过任何东西,所以我的记忆可能会起作用。(你已被警告过)