Suche…


Um Ihre Ansicht auf jede Anwendung zu setzen, müssen Sie sie dem entsprechenden Fenstermanager zuordnen. Dazu benötigen Sie die Systemalarmberechtigung, die Sie durch Hinzufügen der folgenden Zeile zu Ihrer Manifestdatei anfordern können:

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

Hinweis: Wenn Ihre Anwendung zerstört wird, wird Ihre Ansicht aus dem Fenstermanager entfernt. Daher ist es besser, die Ansicht zu erstellen und sie durch einen Vordergrunddienst dem Fenstermanager zuzuweisen.

Ansicht dem WindowManager zuweisen

Sie können eine Window Manager-Instanz wie folgt abrufen:

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

Um die Position Ihrer Ansicht zu definieren, müssen Sie einige Layout-Parameter wie folgt erstellen:

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;

Nun können Sie Ihre Ansicht zusammen mit den erstellten Layoutparametern der Window Manager-Instanz wie folgt zuordnen:

mWindowManager.addView(yourView, mLayoutParams);

Voila! Ihre Ansicht wurde erfolgreich auf alle anderen Anwendungen platziert.

Hinweis: Ihre Ansicht wird nicht auf die Tastensperre gestellt.

Erteilen der SYSTEM_ALERT_WINDOW-Berechtigung für Android 6.0 und höher

Ab Android 6.0 muss diese Berechtigung dynamisch erteilt werden.

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

Fehler unter 6.0 unter der Berechtigung verweigert,

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

Lösung: -

Anfordern der Overlay-Berechtigung wie unten

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

Überprüfen Sie das Ergebnis

@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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow