2012年11月14日水曜日

一部端末でTYPE_SYSTEM_ALERTを使用してViewを登録しても最前面に表示されなかった問題


手元で詳しくデバッグを行ったわけではないので、詳細は不明。
あくまで参考情報として書いておきます。

画面最前面にViewを表示するために、WindowManagerにViewを渡すコードとして下記のような感じでLayoutParamsを登録していました。


WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
    300,
    300,
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    PixelFormat.TRANSLUCENT
);

WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(view, layoutParams); // Viewは任意


すると、一部端末(具体的には友人の"Medias N-04C" Android ver 2.3.3)でViewが表示されないと報告を受けました。
ちなみに、手元にある"Galaxy SIII"、"Galaxy S"、PC内のAndroid エミュレータ(Android 4.0.3、 Android 2.3.3)ではViewが表示されてます。
いろいろ試した結果、単純に「WindowManager.LayoutParams.FLAG_FULLSCREEN」をLayoutParamsの指定から取り除いたところ、Viewが表示されるようになったとのこと。
layoutParamsの指定部分

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
    300,
    300,
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
    PixelFormat.TRANSLUCENT
);

そもそも、フルスクリーン(ステータスバーが非表示になる)を目的としていないのに入っていたことも問題なのですが、これほど動作に差がでるとは思っていませんでした。

Web上にあるサンプル等では"FLAG_FULLSCREEN"が含まれているケースも多いですが、「端末によって挙動が違う・・・」という方はもしかしたらこの部分の変更で表示が行えるかもしれません。


0 件のコメント:

コメントを投稿