Поиск…


Всплывающее наложение

Чтобы разместить ваше представление поверх каждого приложения, вы должны назначить свое представление соответствующему оконному менеджеру. Для этого вам нужно разрешение системного предупреждения, которое можно запросить, добавив следующую строку в файл манифеста:

<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...
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow