Android
Tworzenie nakładki (zawsze na wierzchu) systemu Windows
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...
}
}
}