Sök…


För att lägga din vy ovanpå varje program måste du tilldela din vy till motsvarande fönsterhanterare. För det behöver du systemvarningstillstånd, som kan begäras genom att lägga till följande rad i din manifestfil:

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

Obs! Om din ansökan förstörs tas din vy bort från fönsterhanteraren. Därför är det bättre att skapa vyn och tilldela den till fönsterhanteraren av en förgrundservice.

Tilldela en vy till WindowManager

Du kan hämta en fönsterhanteringsinstans på följande sätt:

WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

För att definiera positionen för din vy måste du skapa några layoutparametrar enligt följande:

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;

Nu kan du tilldela din vy tillsammans med de skapade layoutparametrarna till fönsterhanteringsinstansen på följande sätt:

mWindowManager.addView(yourView, mLayoutParams);

Voila! Din vy har placerats ovanpå alla andra applikationer.

Obs! Vyn kommer inte att placeras ovanpå tangentskyddet.

Bevilja SYSTEM_ALERT_WINDOW Behörighet på Android 6.0 och högre

Från android 6.0 måste denna behörighet beviljas dynamiskt,

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

Kasta under tillstånd nekas fel den 6.0,

Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@86fb55b -- permission denied for this window type

Lösning: -

Begär överläggningstillstånd enligt nedan,

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);
}

Kontrollera om resultatet,

@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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow