Android
Erstellen von Overlay-Fenstern (immer im Vordergrund)
Suche…
Popup-Überlagerung
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...
}
}
}