J2ME 软键包装器

Posted

技术标签:

【中文标题】J2ME 软键包装器【英文标题】:J2ME Soft Key Wrapper 【发布时间】:2009-11-15 01:49:44 【问题描述】:

阅读一些文章,告诉我软键因设备而异。 有人说左软键为-6或-21,右软键为-7或-22。 鉴于这种情况,是否有任何好的包装器或功能或最佳实践来正确处理它?

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

【问题讨论】:

【参考方案1】:

为了让您了解问题的范围,请查看table 的键码。

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

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

最后,如果您的应用程序使用了代码子集,您可能能够摆脱硬编码列表 - 对于某些代码,没有或很少发生冲突(LEFT 通常为 -3 或-61,而这些代码通常没有其他含义)。同样,这不是一个理想的方法。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

不得不完全不同意上面的 Martin Clayton,类似于this method 在运行时识别主机手机绝对是处理这个问题的正确方法。并且包含一个标准类来为您执行此操作比使用多个 JAD/JAR IMO 更方便。

【讨论】:

@funkybro - 这是我的建议之一,所以我猜你只是部分不同意 :) 一些应用在 JAD 中有用户特定的数据(每个用户都是唯一的),但是单个 JAR。在这种情况下,向 JAD 添加一两行额外的代码没什么大不了的。另见德鲁宾的评论。 是的,但是运行时感知您所使用的平台的价值比软键代码更深入;它还允许您绘制漂亮的 UI 并解决特定于手机的错误,所有这些都无需单独的 JAR。【参考方案4】:

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

`

【讨论】:

【参考方案5】:

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 中写过任何东西,所以我的记忆可能会出戏。(您已被警告过)

【讨论】:

以上是关于J2ME 软键包装器的主要内容,如果未能解决你的问题,请参考以下文章

如何在黑莓应用程序中使用软键?

J2ME“notifyDestroyed()”在诺基亚 501 上无法正常工作

未找到鉴别器键时的 Mongoid 行为

如何在 Scikit-Learn 中获取 GridSearchCV() 的 OneVsRestClassifier(LinearSVC()) 的估算器键参考?

在 J2ME 中的 Canvas 上换行 [关闭]

intellij idea 2019 右键包新建文件是没有java Class选项