Android: Не вдається додати вікно. Дозвіл відмовлено для цього типу вікон


85

Я працюю над додатком , де мені потрібно , щоб відобразити вікно з деякою інформацією ON на екрані блокування (KeyGuard) без розблокування телефону. Я припустив, що, можливо, міг би це зробити за допомогою WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG

Але щоразу, коли мій додаток аварійно завершує роботу з такою помилкою:

android.view.WindowManager $ BadTokenException: Не вдається додати вікно android.view.ViewRootImpl$W@40ec8528 - для цього типу вікна відмовлено

Ці повідомлення ( тут , тут і тут ) дають однакову відповідь. Щоб додати наступний дозвіл у файл маніфесту.

android.permission.SYSTEM_ALERT_WINDOW

Рішення, яке я впровадив, але все ще отримую ту саму помилку. Будь-яке уявлення про те, що я роблю не так?

Ось дозволи в моєму файлі маніфесту:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidpilot.keyguardwindow" >

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />

І це код, який я використовую, щоб додати Вікно на екран блокування

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    mView = mInflater.inflate(R.layout.lock_screen_notif, null);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

    wm.addView(mView, params);

У когось є якась ідея?

PS Я тестую на HTC Desire 620 DS під управлінням Android 4.4.2

Відповіді:


30

З цілком очевидних причин звичайним програмам забороняється створювати довільні вікна поверх екрана блокування . Як ви думаєте, що я міг би зробити, якби на вашому екрані блокування створив вікно, яке могло б ідеально імітувати справжній екран блокування, щоб ви не могли зрозуміти різниці?

Технічною причиною вашої помилки є використання TYPE_KEYGUARD_DIALOGпрапора - для цього потрібен android.permission.INTERNAL_SYSTEM_WINDOWдозвіл на рівні підпису. Це означає, що використовувати його можуть лише програми, підписані тим самим сертифікатом , що й автор дозволу.

Творцем android.permission.INTERNAL_SYSTEM_WINDOWє сама система Android, тому, якщо ваш додаток не є частиною ОС, у вас немає шансів.

Існують чітко визначені та добре задокументовані способи сповіщення користувача про інформацію з екрана блокування . Ви можете створювати індивідуальні сповіщення, які відображаються на екрані блокування, і користувач може взаємодіяти з ними.


2
Особисто я шукав щось на зразок сповіщень на екрані блокування програми Facebook. Я вже знав про нові сповіщення на екрані блокування, але наразі вони працюють лише в Android 22. Мені потрібне рішення, яке б працювало на Android 16 та новіших версіях. Але ваша відповідь має цілком сенс, і я прийму її як таку. Мені вдалося відобразити вікно на екрані блокування, але це не те, що мені потрібно, я опублікую рішення, яке я знайшов нижче.
— DroidPilot

1
Якщо програмам потрібен цей дозвіл, їх можна отримати після встановлення та відкриття.
— SkorpEN

Я думаю , що з Oreo це правильна відповідь stackoverflow.com/a/48481628/504179
— ATOM

107

якщо ви використовуєте apiLevel >= 19, не використовуйте

WindowManager.LayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 

що отримує таку помилку:

android.view.WindowManager $ BadTokenException: Не вдається додати вікно android.view.ViewRootImpl$W@40ec8528 - для цього типу вікна відмовлено

Використовуйте замість цього:

LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL

3
Я чудово TYPE_SYSTEM_ALERTпрацюю на Android 5.1 із android.permission.SYSTEM_ALERT_WINDOWнаданим у маніфесті.
— Сем

Я повинен використовувати android.permission.SYSTEM_ALERT_WINDOWз LayoutParams.TYPE_TOAST?
— t0m

1
Я спробував LayoutParams.TYPE_TOAST. Це працює для мене на льодяниках і зефірі, як API рівня 6.0.1. До цього я використовував WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, який працював лише для Lollipop.
— Прашант,

на жаль, це спричиняє "Виявлено накладання екрану" у випадку, якщо якась програма запитує діалогове вікно дозволу (якщо ваш вигляд активний)
— Сергій

Це не спрацювало б, якщо ви намагаєтеся показати вікно всередині служби або приймача трансляції
— FindOutIslamNow

78

Думаю, слід диференціювати ціль (до і після Oreo)

int LAYOUT_FLAG;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
    LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
}

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    LAYOUT_FLAG,
    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT);

Я намагаюся застосувати подібний прийом, але андроїд-студія не може розпізнати Build.VERSION_CODES.O& WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY. Мій targetSdkVersion - 26
— Гейб О'Лірі,

Оцініть вашу допомогу +1 з мого боку.
— Савен

@ GabeO'Leary Я стикаюся з такою ж проблемою, чи є у вас рішення для цього?
— Сагар

49

Я з усіх сил намагався спробувати всі приклади, доступні для цього випуску. Нарешті я отримав відповідь на це. Не знаю, наскільки він надійний, але мій додаток зараз не виходить з ладу.

windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    //here is all the science of params
    final LayoutParams myParams = new LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

Просто надайте дозвіл у своєму файлі маніфесту

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

Крім цього, ви також можете перевірити рівень API, якщо його> = 23 тоді

 if(Build.VERSION.SDK_INT >= 23) {
    if (!Settings.canDrawOverlays(Activity.this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, 1234);
    }
}
            else
{
    Intent intent = new Intent(Activity.this, Service.class);
    startService(intent);
}

Сподіваюсь, це десь комусь допоможе. Повний приклад https://anam-android-codes.blogspot.in/?m=1


13

Для рівня Android API 8.0.0 слід використовувати

WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

замість

LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL

або SYSTEM_ALERT.


TYPE_APPLICATION_OVERLAY відсутній у списку параметрів, представлених в Android Studio. Я отримую "не вдається вирішити тип символу". Чого мені не вистачає?
— philcruz

11

спробуйте цей код працює ідеально

int layout_parms;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 

    {  
         layout_parms = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

    }

     else {

            layout_parms = WindowManager.LayoutParams.TYPE_PHONE;

    }

    yourparams = new WindowManager.LayoutParams(       
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            layout_parms,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

ти врятував мені життя
— Фо Нко

@BakaWaii, де ви хочете показати віджет, щоб помістити цей код туди, буде працювати нормально
— shakirullah orakzai

6

Пошук

Намалюйте інші програми

у налаштуваннях і ввімкніть програму. Для Android 8 Oreo спробуйте

Налаштування> Програми та сповіщення> Інформація про програму> Відображення над іншими програмами> Увімкнути


1
ти рятівник
— Нур Хоссен

5

Спочатку переконайтеся, що у вас є дозвіл на додавання у файл маніфесту.

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

Перевірити, чи програма має дозвіл на використання інших програм чи ні? Цей дозвіл за замовчуванням доступний для API <23. Але для API> 23 ви повинні просити дозволу під час виконання.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {

    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 1);
} 

Використовуйте цей код:

public class ChatHeadService extends Service {

private WindowManager mWindowManager;
private View mChatHeadView;

WindowManager.LayoutParams params;

public ChatHeadService() {
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();

    Language language = new Language();
    //Inflate the chat head layout we created
    mChatHeadView = LayoutInflater.from(this).inflate(R.layout.dialog_incoming_call, null);


    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
        params.x = 0;
        params.y = 100;
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mWindowManager.addView(mChatHeadView, params);

    } else {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSLUCENT);


        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
        params.x = 0;
        params.y = 100;
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mWindowManager.addView(mChatHeadView, params);
    }

    TextView tvTitle=mChatHeadView.findViewById(R.id.tvTitle);
    tvTitle.setText("Incoming Call");

    //Set the close button.
    Button btnReject = (Button) mChatHeadView.findViewById(R.id.btnReject);
    btnReject.setText(language.getText(R.string.reject));
    btnReject.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //close the service and remove the chat head from the window
            stopSelf();
        }
    });

    //Drag and move chat head using user's touch action.
    final Button btnAccept = (Button) mChatHeadView.findViewById(R.id.btnAccept);
    btnAccept.setText(language.getText(R.string.accept));


    LinearLayout linearLayoutMain=mChatHeadView.findViewById(R.id.linearLayoutMain);



    linearLayoutMain.setOnTouchListener(new View.OnTouchListener() {
        private int lastAction;
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                    //remember the initial position.
                    initialX = params.x;
                    initialY = params.y;

                    //get the touch location
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();

                    lastAction = event.getAction();
                    return true;
                case MotionEvent.ACTION_UP:
                    //As we implemented on touch listener with ACTION_MOVE,
                    //we have to check if the previous action was ACTION_DOWN
                    //to identify if the user clicked the view or not.
                    if (lastAction == MotionEvent.ACTION_DOWN) {
                        //Open the chat conversation click.
                        Intent intent = new Intent(ChatHeadService.this, HomeActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);

                        //close the service and remove the chat heads
                        stopSelf();
                    }
                    lastAction = event.getAction();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    //Calculate the X and Y coordinates of the view.
                    params.x = initialX + (int) (event.getRawX() - initialTouchX);
                    params.y = initialY + (int) (event.getRawY() - initialTouchY);

                    //Update the layout with new X & Y coordinate
                    mWindowManager.updateViewLayout(mChatHeadView, params);
                    lastAction = event.getAction();
                    return true;
            }
            return false;
        }
    });
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mChatHeadView != null) mWindowManager.removeView(mChatHeadView);
}

}


Ви можете поділитися своїм xml-кодом і переглянути в github або щось інше, це буде корисно для мене.
— Павел

4

змініть прапорець прапора Windowmanger "TYPE_SYSTEM_OVERLAY" на "TYPE_APPLICATION_OVERLAY" у своєму проекті, щоб зробити сумісним з Android O

WindowManager.LayoutParams.TYPE_PHONE до WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY


3

Мені вдалося нарешті відобразити вікно на екрані блокування з використанням TYPE_SYSTEM_OVERLAYзамість TYPE_KEYGUARD_DIALOG. Це працює належним чином і додає вікно на екрані блокування.

Проблема в тому, що вікно додається поверх усього, що можливо. Тобто вікно навіть з’явиться у верхній частині клавіатури / блокування шаблону у випадку надійного блокування екранів. У випадку незахищеного екрана блокування він з’явиться у верхній частині панелі сповіщень, якщо його відкрити з екрана блокування.

Для мене це неприпустимо. Я сподіваюся, що це може допомогти комусь, хто стикається з цією проблемою.


Велике спасибі за рішення. Чи є спосіб його звільнити? Я не можу закрити діалогове вікно, коли додаю його як TYPE_SYSTEM_OVERLAY. Мій setOnDismissListener на AlertDialog не отримує виклику.
— Том Тейлор

3

Я щойно додав просте подання до WindowManagerнаступних кроків:

  1. Створіть один файл макета для показу (у моєму випадку dummy_layout)
  2. Додайте дозвіл у маніфесті та динамічно.
// 1. Show view
private void showCustomPopupMenu()
{
    windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    // LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    // View view = layoutInflater.inflate(R.layout.dummy_layout, null);
    ViewGroup valetModeWindow = (ViewGroup) View.inflate(this, R.layout.dummy_layout, null);
    int LAYOUT_FLAG;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
    }
    WindowManager.LayoutParams params=new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        LAYOUT_FLAG,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);

    params.gravity= Gravity.CENTER|Gravity.CENTER;
    params.x=0;
    params.y=0;
    windowManager.addView(valetModeWindow, params);
}

// 2. Get permissions by asking
if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 1234);
}

За допомогою цього ви можете додати подання до WM.

Випробувано в пирозі.


2

LayoutParams.TYPE_PHONE застаріло. Я оновив свій код таким чином.

parameters = if (Build.VERSION.SDK_INT > 25) {
        LayoutParams(
                minHW * 2 / 3, minHW * 2 / 3,
                LayoutParams.TYPE_APPLICATION_OVERLAY,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT)
    }else {
        LayoutParams(
                minHW * 2 / 3, minHW * 2 / 3,
                LayoutParams.TYPE_PHONE,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT)
    }

LayoutParams.TYPE_APPLICATION_OVERLAY вимагає api рівня 26 або вище.


0

Основною причиною відмови у дозволі є те, що ми не маємо дозволу на малювання інших програм. Ми повинні надати дозвіл на малювання над іншими програмами, що можна зробити за допомогою наступного коду

Код запиту на дозвіл

    public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

додайте це у свою MainActivity


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
            askPermission();
}


private void askPermission() {
        Intent intent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
        startActivityForResult(intent,ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}

Додайте також це

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE){
            if(!Settings.canDrawOverlays(this)){
                askPermission();
            }
        }
    }


0

Я намагався знайти робоче рішення із ApplicationContextі TYPE_SYSTEM_ALERTі знайшов заплутані рішення. Якщо ви хочете, щоб діалогове вікно було відкрите з будь-якої діяльності, навіть діалогове вікно є єдиним елементом, який ви повинні використовувати getApplicationContext(), і якщо ви хочете діалогове вікно, TYPE_SYSTEM_ALERTвам знадобляться наступні кроки :

спочатку отримайте екземпляр діалогового вікна з правильною темою, також вам потрібно керувати сумісністю версій, як це було зроблено у моєму наступному фрагменті:

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext(), R.style.Theme_AppCompat_Light);

Після встановлення заголовка, повідомлення та кнопок ви повинні побудувати діалогове вікно як:

AlertDialog alert = builder.create();

Зараз тут typeвідтворюється основний ролик, оскільки це причина аварії, я обробив сумісність наступним чином:

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    }

Примітка : якщо ви використовуєте спеціальне діалогове вікно, AppCompatDialogяк показано нижче:

AppCompatDialog dialog = new AppCompatDialog(getApplicationContext(), R.style.Theme_AppCompat_Light);

Ви можете безпосередньо визначити свій тип для AppCompatDialogекземпляра наступним чином:

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    }

Не забудьте додати дозвіл маніфесту:

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

0
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.START | Gravity.TOP;
    params.x = left;
    params.y = top;
    windowManager.addView(view, params);

} else {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);


    params.gravity = Gravity.START | Gravity.TOP;
    params.x = left;
    params.y = top;
    windowManager.addView(view, params);
}

0

Переконайтеся, що WindowManager.LayoutParams.TYPE_SYSTEM_ERRORдодано для версії ОС <Oreo, оскільки вона застаріла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.