サーチ…


ポップアップオーバーレイ

すべてのアプリケーションの上にビューを配置するには、ビューを対応するウィンドウマネージャに割り当てる必要があります。そのためには、システムアラートのアクセス許可が必要です。これは、マニフェストファイルに次の行を追加することで要求できます。

<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