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.