表題ままでございます。
端末についているメニューボタンを押すとクラッシュする端末があるという話。
主にLG系の端末でAndroid4.1まではやられてるようで、もしかしたらハード側の問題かもってお話です。
ちなみに私もLG OptimusGを持っていましたので試しに最近のGmailを開いて押したらクラッシュ。
なお、こちらでお話されています。
https://code.google.com/p/android/issues/detail?id=78154
とりあえず、appCompati-v21ではメニューキーを押すとmenu内で"never"とか非表示されているものが、下からオーバーフロー表示される従来のタイプになっています。
これv21からだっけかな?昔からそうだったかな?
ちょっとそこらへん覚えてませんがそうなってます。
以下、Gmailでの例
左:上のメニュー押した場合
右:端末のメニューボタン押した場合
それで最初に記載しましたが、この右画像の端末のメニューボタンを押した時に落ちるということ。
さて、対策ですが。
とりあえずLGがやばいって事なのでKeyEventが飛んできたらフックして、"Build.MANUFACTURER"でLGのものだったら直接openOptionsMenu()させてあげるって感じで回避できます。
コード的には以下。
上記コードは最初にリンクしたフォーラムのコメント(#19)のままです。
このブログだけってのもあれなのでフォーラムにコメントしてみました。
他の方が書かれている回避策と若干違う部分がありますので理由を。
"Build.VERSION.SDK_INT"が16以下になってるとこ。
これは例えば私の持っているLG OptimusGなんかはICS(Api14)なのでフォーラムままだと対象に含まれないのです。
"Build.BRAND"ではなく"Build.MANUFACTURER"なとこ。
海外は分かりませんが日本の場合キャリア名になってる場合があるので"Build.BRAND"だと拾えないものもありますので注意。
例えば私の持っているLG OptimusGは"Build.BRAND"だと"LGE"ではなく"KDDI"となってます。
ちょっと補足:
もしかしたら16以上もやばいんではと思う方は上記のコードの
(Build.VERSION.SDK_INT <= 16) &&
部分を取り除けばLGEは全部直接って形なると思います。
*自分はいったんそうしてます。
さらにLG製以外もやばいかも?って心配な場合はifをはずしてしまえばよいかと。
でも今後の端末がどうなるかわからないので一律はちょっとって気もします。。 すくなくともうちのギャラクシーさんは問題ありませんしね。
とりいそぎ最近起きてるお話ですので記述しておきます。
端末についているメニューボタンを押すとクラッシュする端末があるという話。
主にLG系の端末でAndroid4.1まではやられてるようで、もしかしたらハード側の問題かもってお話です。
ちなみに私もLG OptimusGを持っていましたので試しに最近のGmailを開いて押したらクラッシュ。
なお、こちらでお話されています。
https://code.google.com/p/android/issues/detail?id=78154
とりあえず、appCompati-v21ではメニューキーを押すとmenu内で"never"とか非表示されているものが、下からオーバーフロー表示される従来のタイプになっています。
これv21からだっけかな?昔からそうだったかな?
ちょっとそこらへん覚えてませんがそうなってます。
以下、Gmailでの例
左:上のメニュー押した場合
右:端末のメニューボタン押した場合
それで最初に記載しましたが、この右画像の端末のメニューボタンを押した時に落ちるということ。
さて、対策ですが。
とりあえずLGがやばいって事なのでKeyEventが飛んできたらフックして、"Build.MANUFACTURER"でLGのものだったら直接openOptionsMenu()させてあげるって感じで回避できます。
コード的には以下。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_MENU) &&
(Build.VERSION.SDK_INT <= 16) &&
(Build.MANUFACTURER.compareTo("LGE") == 0)) {
return true;
}
return super.onKeyDown(keyCode, event);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_MENU) &&
(Build.VERSION.SDK_INT <= 16) &&
(Build.MANUFACTURER.compareTo("LGE") == 0)) {
openOptionsMenu();
return true;
return true;
}
return super.onKeyUp(keyCode, event);
return super.onKeyUp(keyCode, event);
}
上記コードは最初にリンクしたフォーラムのコメント(#19)のままです。
このブログだけってのもあれなのでフォーラムにコメントしてみました。
他の方が書かれている回避策と若干違う部分がありますので理由を。
"Build.VERSION.SDK_INT"が16以下になってるとこ。
これは例えば私の持っているLG OptimusGなんかはICS(Api14)なのでフォーラムままだと対象に含まれないのです。
"Build.BRAND"ではなく"Build.MANUFACTURER"なとこ。
海外は分かりませんが日本の場合キャリア名になってる場合があるので"Build.BRAND"だと拾えないものもありますので注意。
例えば私の持っているLG OptimusGは"Build.BRAND"だと"LGE"ではなく"KDDI"となってます。
ちょっと補足:
もしかしたら16以上もやばいんではと思う方は上記のコードの
(Build.VERSION.SDK_INT <= 16) &&
部分を取り除けばLGEは全部直接って形なると思います。
*自分はいったんそうしてます。
さらにLG製以外もやばいかも?って心配な場合はifをはずしてしまえばよいかと。
でも今後の端末がどうなるかわからないので一律はちょっとって気もします。。 すくなくともうちのギャラクシーさんは問題ありませんしね。
とりいそぎ最近起きてるお話ですので記述しておきます。