Szukaj…


Nakładka wyskakująca

Aby umieścić swój widok na wierzchu każdej aplikacji, musisz przypisać swój widok do odpowiedniego menedżera okien. W tym celu potrzebujesz uprawnień do alertów systemowych, o które można poprosić, dodając następujący wiersz do pliku manifestu:

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

Uwaga: jeśli aplikacja zostanie zniszczona, widok zostanie usunięty z menedżera okien. Dlatego lepiej jest utworzyć widok i przypisać go do menedżera okien przez usługę pierwszego planu.

Przypisywanie widoku do menedżera okien WindowManager

Możesz pobrać instancję menedżera okien w następujący sposób:

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

Aby zdefiniować pozycję widoku, musisz utworzyć niektóre parametry układu w następujący sposób:

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;

Teraz możesz przypisać widok wraz z utworzonymi parametrami układu do instancji menedżera okien w następujący sposób:

mWindowManager.addView(yourView, mLayoutParams);

Voila! Twój widok został pomyślnie umieszczony nad wszystkimi innymi aplikacjami.

Uwaga: Twój widok nie zostanie umieszczony na klawiaturze.

Przyznanie uprawnienia SYSTEM_ALERT_WINDOW na Androidzie 6.0 i nowszych

W Androidzie 6.0 to uprawnienie musi być udzielane dynamicznie,

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

Rzucanie poniżej uprawnień odmówiło błędu w wersji 6.0,

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

Rozwiązanie :-

Prośba o pozwolenie na nakładkę, jak poniżej,

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

Sprawdź wynik,

@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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow