2009-11-15 12 views
5

Einige Artikel gelesen, sagte mir, dass Softkeys zwischen Geräten variiert. Einige sagen -6 oder -21 für den linken Softkey und -7 oder -22 für den rechten Softkey. Gibt es angesichts dieser Situation einen guten Wrapper oder eine Funktion oder Best Practice, um es richtig zu handhaben?J2ME Soft Key Wrapper

Wenn nicht für ALLE Geräte möglich, was ist der beste Weg, um die meisten Geräte zu unterstützen? mit wenig oder gar keinem Hack?

Antwort

4

Um Ihnen ein Gefühl für den Umfang des Problems zu geben, werfen Sie einen Blick auf diese table Keycodes.

Omermuhammeds Ansatz ist ein guter Ansatz, wenn Sie den JAD-Inhalt abhängig vom Zielhandgerät variieren können, z. B. indem Sie in einer Downloadanforderung von einem On-Handset-Webbrowser das User-Agent-Headerfeld anzeigen.

Wenn Sie das Mobilteil erst identifizieren können, nachdem die App zugestellt wurde, können Sie sich etwa die Nummer this ansehen, die zur Laufzeit das Host-Mobilteil bestimmt und die Schlüsselcodezuordnungen entsprechend einstellt. Sieht für mich allerdings umständlich aus.

Schließlich, wenn Ihre Anwendung eine Teilmenge von Codes verwendet können Sie in der Lage sein, mit hart-codierten Listen - für einige Codes gibt es keine oder wenige Kollisionen (LEFT ist in der Regel entweder -3 oder -61, und diese Codes bedeuten normalerweise nichts anderes). Wiederum kein idealer Ansatz.

Letzte vorgeschlagene Ressourcen für Sie: wurfl oder Benutzer-Agent-Strings und die J2MEPolish Geräte-Datenbank für Geräte-Keycodes.

-2

MIDP definiert die folgende Konstante für die Tasten eines Standard-ITU-T-Tastenfeld: KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUM9, KEY_POUND und KEY_STAR. Anwendungen sollten sich nicht auf das Vorhandensein zusätzlicher Schlüsselcodes verlassen. Insbesondere Groß- und Kleinbuchstaben oder Zeichen, die durch mehrmaliges Drücken einer Taste erzeugt werden, werden von Schlüsselereignissen auf niedriger Ebene nicht unterstützt. Ein "Name", der dem Schlüssel zugewiesen ist, kann mit der Methode getKeyName() abgefragt werden.

AFAIR die GetKeyName Methode zurückgegeben ganz dasselbe auf den meisten Handys, so dass es sehr zuverlässig war, aber ich habe nicht vor, da ca. 2 Jahren etwas in J2ME geschrieben, so meine Erinnerung Tricks spielen könnten. (Sie wurden gewarnt)

4

Der einfachste Weg, den ich gefunden habe, war, es in Code mit den empfohlenen Werten basierend auf ITU-T-Standard einzurichten und überschreiben es mit einem jad-Parameter. Für jede gegebene App sucht sie nach dem jad-Parameter zum Zeitpunkt des Starts der App und stellt ihn ein, andernfalls werden die Standardwerte verwendet.

Ich habe diese und ähnliche Techniken verwendet, um Apps zu schreiben, die schnell portiert werden können, und dieser Prozess ist allgemein bekannt.

0

Ich stimme Martin Clayton nicht zu, etwas Ähnliches wie this method der Identifizierung von Host-Handys zur Laufzeit ist absolut der richtige Weg, um mit diesem Problem umzugehen. Und einschließlich einer Standardklasse, um dies für Sie zu tun, ist FAR weniger umständlich, als mit mehreren JADs/JARs IMO herumzuspielen.

+0

@. funkybro - das war einer meiner Vorschläge, also denke ich, dass Sie nur teilweise nicht zustimmen :) Einige Apps haben benutzerspezifische Daten in der JAD (die für jeden Benutzer einzigartig ist), aber eine einzige JAR. In diesem Fall ist es keine große Sache, dem JAD eine oder zwei zusätzliche Zeilen hinzuzufügen. Siehe auch Drubins Kommentar. –

+0

Richtig, aber der Wert der Laufzeitsensibilität für die Plattform, auf der Sie arbeiten, läuft tiefer als Soft-Key-Codes; Es ermöglicht Ihnen auch, nette Benutzeroberflächen zu erstellen und handyspezifische Bugs zu behandeln, ohne separate JARs zu haben. – funkybro

0

Dies ist die Methode, die ich erstellt haben, die Tastencodes und Tastennamen verwendet. Ich habe diesen Code vor ungefähr 10 Jahren geschrieben und damals unterstützte er die meisten Geräte. (Eine Ausnahme fand ich allerdings bei einigen Sagem-Modellen, bei denen die Tastencodes -6 und -7 umgekehrt sind!Aber Sie könnten wahrscheinlich umgehen, dass wieder die Schlüsselnamen - Sie können jedoch auch den User-Agent erhalten müssen)

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

    } 

Aktualisiert Code, basierend auf 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; 
    } 

}`