Android
Создание окна Overlay (всегда на вершине) Windows
Поиск…
Всплывающее наложение
Чтобы разместить ваше представление поверх каждого приложения, вы должны назначить свое представление соответствующему оконному менеджеру. Для этого вам нужно разрешение системного предупреждения, которое можно запросить, добавив следующую строку в файл манифеста:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Примечание. Если ваше приложение будет уничтожено, ваше представление будет удалено из диспетчера окон. Поэтому лучше создать представление и назначить его оконному менеджеру с помощью функции переднего плана.
Назначение окна WindowManager
Вы можете получить экземпляр диспетчера окон следующим образом:
WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
Чтобы определить позицию вашего представления, вам необходимо создать некоторые параметры макета следующим образом:
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;
Теперь вы можете назначить свое представление вместе с созданными параметрами макета для экземпляра диспетчера окон следующим образом:
mWindowManager.addView(yourView, mLayoutParams);
Вуаля! Ваше представление было успешно размещено поверх всех других приложений.
Примечание. Вы видите, что вы не будете помещены поверх клавиатуры.
Предоставление SYSTEM_ALERT_WINDOW Разрешения на Android 6.0 и выше
От android 6.0 это разрешение должно предоставлять динамически,
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Бросок ниже разрешения отклонил ошибку на 6.0,
Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@86fb55b -- permission denied for this window type
Решение :-
Запрос разрешения Overlay, как показано ниже,
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);
}
Проверьте результат,
@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...
}
}
}