web-dev-qa-db-ja.com

Android=で常にトップフルスクリーンオーバーレイアクティビティを作成する方法

常にAndroidのディスプレイの前面にあるアクティビティを作成できるようにしたいと思います。入力を受け取るべきではなく、その下にあるアプリケーションに渡すだけです。 HUDのようなもの。

基になるウィンドウのタイプをTYPE_SYSTEM_ALERTに設定する必要があることを調査できましたが、Androidは私のコードを無視しています-マニフェストからAndroid.permission.SYSTEM_ALERT_WINDOW権限を削除しても例外はスローされません。 (このウィンドウタイプを使用する必要があります。)ダイアログでALERTタイプを使用しようとすると、正常に機能しましたが、ダイアログをフルスクリーンの透明なエンティティにすることはできません。これが私のコードです。何か単純なものが足りない可能性があります。

public void onCreate(Bundle savedInstanceState) {       
     super.onCreate(savedInstanceState);        

     requestWindowFeature(Window.FEATURE_NO_TITLE);
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);             
     getWindow().setBackgroundDrawableResource(Android.R.color.transparent);
     getWindow().setFormat(PixelFormat.TRANSLUCENT);
     setContentView(R.layout.main);
}

半透明設定は、XMLマニフェストで外部で有効にする必要があります。そうしないと、機能しませんでした。

 <item name="Android:windowIsTranslucent">true</item>
21
tmouse
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);

WindowManager wm = (WindowManager) getApplicationContext()
    .getSystemService(Context.WINDOW_SERVICE);

ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null);
getWindow().setAttributes(params);
wm.addView(mTopView, params);
24
tmouse

(tmouseによって)受け入れられた回答 は、私にとってはうまく機能しないことがわかりました。多分それは古いAPIレベルで機能しましたか? APIレベル24を使用しています。

その特定の答えはお勧めしました:

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
    PixelFormat.TRANSLUCENT
);

これに問題があります。 WindowManager.LayoutParamsに存在するコンストラクタは次のとおりです。

enter image description here

したがって、WindowManager.LayoutParams.FLAG_FULLSCREENフラグはint wおよびint hの明示的な値として使用されます。これはダメです!ビューのサイズは1024 * 1024に設定されます—そのため、fill画面にはなりません。そしてexplicitlyレイアウトの幅と高さをデバイスの寸法と一致するように設定したとしても、画面の向きが変わっても更新されません変更。別のアプローチが必要です…


全画面オーバーレイのcorrect構成は次のようであることがわかりました。

final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_FULLSCREEN,
    PixelFormat.TRANSLUCENT
);

つまり、幅と高さをexplicitlyで指定する必要がなくなりました。代わりに、レイアウトは完全にフラグに依存しています。

はい、WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREENは必須フラグです。ステータスバーなどの装飾を上書きしたい場合に必要です。

APIレベル> = 19では、WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAYの代わりにTYPE_SYSTEM_ALERTを使用する必要があります。これは私が少し前に書いたメモですが、悲しいことに、なぜ私がそれを考えたのかを裏付ける引用を見つけることができませんでした。


ボーナスノート(これを読んでいる場合、おそらくフルスクリーンオーバーレイを作成しようとしていることでしょう):

マニフェストには次の権限が必要です(説明 ここ ):

<uses-permission Android:name="Android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/>
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>

私の理解では、SYSTEM_ALERT_WINDOWは実際に必要な権限ですが、ACTION_MANAGE_OVERLAY_PERMISSIONも必要です。これにより、実行時にユーザーがSYSTEM_ALERT_WINDOW特権を付与するように要求できます。

私は here フルスクリーンオーバーレイを作成する私の作業中のAPIレベル24アプリにソースコードを提供します。

4
Birchlabs

これをチェック

あなたのAndroidManifest.xmlファイルでそれを言及してください

<activity Android:name=".MyActivity" Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen" />

アクティビティをフルスクリーンで透明にしたい場合

これをチェック

<activity Android:name=".MyActivity" Android:theme="@Android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
0
Ravi1187342