今日、ナビゲーション バー (または戻る、ホームなどがあるソフトキー) を含む画面全体をオーバーレイするアプリを見ました。chainfire による CF.Lumen (android 4.4+ が必要) です。
これは一般的なアプローチでは不可能であり、多くのSOの回答が私に言ったことを思い出しました。そこで、Lumens apk(sorry chainfire) から smali コードを調べました。0x7d6
型指定子として見つかったのはTYPE_SYSTEM_OVERLAY
. 一般に、これによりビューがロック画面の上にオーバーレイされます。見栄えは良いですが、ナビゲーション バー領域をオーバーレイしません。ロック画面でも。に置き換えMATCH_PARENT
ました9999
が、それでもナビゲーションバー領域をオーバーレイしません。
Android のソース コードを調べたところ、文書化されていない型がさらに多くあることに興味深いことがわかりました。
FIRST_SYSTEM_WINDOW = 2000;
TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW+19;
TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW+21;
これらをアプリに適用しましたが、許可が拒否されたというクラッシュが発生しました。INTERNAL_SYSTEM_WINDOW
OR よりも文書化されていないものが必要ですSYSTEM_ALERT_WINDOW
。これらのアクセス許可は、システム アプリに対してのみ付与されます。
これは、ナビゲーションバー領域を除く画面全体を埋めるビューを追加する私のコードです。
それを達成するにはどうすればよいですか?(ナビゲーションバー領域を含むオーバーレイを作成します)
final WindowManager.LayoutParams paramsRL = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
PixelFormat.TRANSLUCENT);
windowManager.addView(view_floating, paramsRL);