2009-11-15 3 views
5

일부 기사를 읽고 소프트 키는 장치마다 다릅니다. 일부는 왼쪽 소프트 키는 -6 또는 -21, 오른쪽 소프트 키는 -7 또는 -22라고합니다. 이 상황에서 제대로 처리 할 수있는 좋은 래퍼 또는 함수 또는 모범 사례가 있습니까?J2ME 소프트 키 래퍼

모든 장치에서 가능하지 않은 경우 대부분의 장치를 지원하는 가장 좋은 방법은 무엇입니까? 사소하거나 전혀 해킹하지 않습니까?

답변

4

문제의 범위에 대한 느낌을주기 위해이 키 코드를 살펴보십시오.

예를 들어 핸드셋 웹 브라우저에서 다운로드 요청의 사용자 에이전트 헤더 필드를보고 대상 핸드셋에 따라 JAD 콘텐츠를 변경할 수있는 경우 Omermuhammed의 접근 방식이 좋습니다.

앱이 전달 될 때까지 핸드셋을 식별 할 수없는 경우 기본적으로 실행시 호스트 핸드셋을 결정하고 키 코드 매핑을 적절하게 설정하는 this과 같은 것을 볼 수 있습니다. 나에게 성가 시게 보입니다.

마지막으로 응용 프로그램에서 코드 하위 집합을 사용하는 경우 은 하드 코드 된 목록에서 벗어날 수 있어야합니다. 일부 코드의 경우 충돌이 거의 없거나 거의 없습니다 (LEFT는 일반적으로 -3 또는 -61이며 그 코드는 일반적으로 다른 것을 의미하지는 않습니다). 다시 말하지만 이상적인 접근 방식은 아닙니다.

최종 추천 리소스 : wurfl 또는 사용자 에이전트 문자열 및 기기 키 코드 용 기기 데이터베이스 J2MEPolish

-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에서 아무것도 작성하지 않았습니다. (당신은 경고되었다)

4

내가 찾은 가장 쉬운 방법은 코드에서 ITU-T 표준을 기반으로 권장 값을 설정하고 jad 매개 변수로 재정의하는 것입니다. 따라서 특정 앱의 경우 앱 시작 시간에 jad 매개 변수의 존재 여부를 찾고 설정합니다. 그렇지 않으면 기본값을 사용합니다.

나는이 기술과 유사한 기술을 사용하여 신속하게 이식 할 수있는 응용 프로그램을 작성했으며이 프로세스는 일반적으로 잘 알려져 있습니다.

0

위의 Martin Clayton과 완전히 일치하지 않는 경우 런타임시 호스트 핸드셋 식별의 this method과 비슷한 것이이 문제를 해결하는 절대적인 방법입니다. 그리고이를 위해 표준 클래스 하나를 포함하는 것이 여러 JAD/JAR IMO를 사용하는 것보다 덜 귀찮은 일입니다.

+0

을 @. funkybro - 내 제안 중 하나 였으므로 부분적으로 동의하지 않는 것 같습니다 :) 일부 응용 프로그램에는 JAD (각 사용자마다 고유 한 사용자 별 데이터)가 있지만 단일 JAR이 있습니다. 이 경우 JAD에 여분의 2 줄을 추가하는 것은별로 중요하지 않습니다. drubin의 의견도 참조하십시오. –

+0

사실,하지만 실행중인 플랫폼에 대한 런타임 인식의 가치는 소프트 키 코드보다 더 깊게 실행됩니다. 별도의 JAR을 사용하지 않고도 멋진 UI를 그리고 핸드셋 관련 버그를 해결할 수 있습니다. – funkybro

0

이것은 내가 작성한 키 코드와 키 이름을 사용하는 방법입니다. 필자는 약 10 년 전에이 코드를 작성했으며 그 당시에는 대부분의 장치를 지원했습니다. (그러나 내가 발견 한 예외 중 하나는 -6-7 키 코드가있는 Sagem 모델입니다!하지만 당신은 아마 해결할 다시 키 이름을 사용하는 수 -하지만 당신은 너무 사용자 에이전트를 획득 할 필요가있을 수있다) 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 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; 
     } 

    } 

업데이트 코드, ...

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

}`