いくつかの記事を読んで、ソフトキーはデバイスによって異なると教えてくれました。左のソフトキーの場合は-6または-21、右のソフトキーの場合は-7または-22と言う人もいます。この状況を考えると、それを適切に処理するための優れたラッパーや関数、またはベストプラクティスはありますか?
すべてのデバイスで不可能な場合、ほとんどのデバイスをサポートするための最良の方法は何ですか?マイナーなハックまたはまったくハックなし?
私が見つけた最も簡単な方法は、ITU-T標準に基づく推奨値を使用してコードで設定し、jadパラメーターでオーバーライドすることでした。そのため、特定のアプリについては、アプリの起動時にjadパラメーターの存在を検索して設定します。それ以外の場合は、デフォルト値を使用します。
私はこれらおよび同様の手法を使用して、迅速に移植できるアプリを作成しました。このプロセスは一般的によく知られています。
問題の範囲を把握するために、このキーコードの表をご覧ください。
Omermuhammedのアプローチは、ターゲットの受話器に応じてJADコンテンツを変更できる場合、たとえば、携帯電話のWebブラウザーからのダウンロード要求のユーザーエージェントヘッダーフィールドを確認する場合に適しています。
アプリが配信されるまで受話器を識別できない場合は、基本的に実行時にホスト受話器を決定し、キーコードマッピングを適切に設定するこのようなものを見ることができます。でも私には面倒に見えます。
最後に、アプリケーションがコードのサブセットを使用している場合、ハードコードされたリストを回避できる可能性があります-一部のコードでは、衝突がないか、ほとんどありません(LEFTは通常-3または-61のいずれかであり、これらのコードは通常はありません他の何かを意味します)。繰り返しますが、理想的なアプローチではありません。
最終的に推奨されるリソース:wurflまたはユーザーエージェント文字列、およびデバイスキーコード用のJ2MEPolishデバイスデータベース。
上記のMartinClaytonに完全に反対する必要があります。実行時にホスト受話器を識別するこの方法に似た方法が、この問題に対処するための絶対的に正しい方法です。そして、これを行うための1つの標準クラスを含めることは、複数のJAD /JARIMOをいじくり回すよりもはるかに面倒ではありません。
これは私が作成したメソッドで、キーコードとキー名を使用します。私はこのコードを約10年前に作成し、当時はほとんどのデバイスをサポートしていました。-6
(ただし、私が見つけた1つの例外は、キーコードとキーコードが逆になっているSagemモデルでした-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;
}
}`
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で何も記述していないため、メモリが悪用される可能性があります(警告されています)。