Android
オーバーレイ(常に最前面)のWindowsの作成
サーチ…
ポップアップオーバーレイ
すべてのアプリケーションの上にビューを配置するには、ビューを対応するウィンドウマネージャに割り当てる必要があります。そのためには、システムアラートのアクセス許可が必要です。これは、マニフェストファイルに次の行を追加することで要求できます。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
注意:アプリケーションが破壊された場合、ビューはウィンドウマネージャから削除されます。したがって、ビューを作成し、それをフォアグラウンドサービスによってウィンドウマネージャに割り当てる方が良いです。
WindowManagerへのビューの割り当て
次のようにして、ウィンドウマネージャインスタンスを取得できます。
WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
ビューの位置を定義するには、次のようにいくつかのレイアウトパラメータを作成する必要があります。
WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
PixelFormat.TRANSLUCENT);
mLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
これで、作成されたレイアウトパラメータとビューをウィンドウマネージャインスタンスに以下のように割り当てることができます:
mWindowManager.addView(yourView, mLayoutParams);
Voila!あなたのビューは他のすべてのアプリケーションの上にうまく配置されています。
注:ビューはキーガードの上に置かれません。
SYSTEM_ALERT_WINDOWの許可アンドロイド6.0以上の許可
アンドロイド6.0から、この権限は動的に付与する必要があります。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
アクセス許可を破棄すると、6.0のエラーが拒否されました。
Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@86fb55b -- permission denied for this window type
解決策: -
以下のようにオーバーレイ許可を要求し、
if(!Settings.canDrawOverlays(this)){
// ask for setting
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
}
結果を確認し、
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_OVERLAY_PERMISSION) {
if (Settings.canDrawOverlays(this)) {
// permission granted...
}else{
// permission not granted...
}
}
}
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow