Включить добавление окна android.view.ViewRootImpl$W@990cb01 & mdash; разрешение отклонено для типа окна 2038 [дубликат]

ArrayList - это сборники данных разных типов, тогда как List<> представляет собой совокупность аналогичных типов собственных депектенций.

51
задан Community 23 May 2017 в 12:18
поделиться

11 ответов

Для того, что должно быть совершенно очевидными причинами, обычным приложениям не разрешается создавать произвольные окна поверх экрана блокировки. Как вы думаете, что я мог бы сделать, если бы я создал окно на вашем заблокированном экране, которое могло бы идеально подражать реальному экрану блокировки, чтобы вы не могли разглядеть разницу?

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

Создателем android.permission.INTERNAL_SYSTEM_WINDOW является сама система Android, поэтому, если ваше приложение является частью ОС, у вас нет шансов.

Есть хорошо определенные и хорошо документированные способы уведомлять пользователя о информации с блокировки экрана . Вы можете создавать настраиваемые уведомления, которые отображаются на заблокированном экране, и пользователь может взаимодействовать с ними.

22
ответ дан adelphus 20 August 2018 в 08:14
поделиться
  • 1
    Лично я искал что-то вроде уведомлений блокировки экрана приложения Facebook. Я уже знал о новых уведомлениях блокировки экрана, но они работают только на Android 22. Мне нужно решение, которое будет работать на Android 16 и выше. Но ваш ответ имеет прекрасный смысл, и я буду принимать его как таковой. Мне удалось отобразить окно на экране блокировки, хотя, но это не то, что мне нужно, я опубликую решение, которое я нашел ниже. – DroidPilot 26 August 2015 в 18:37
  • 2
    Если приложениям требуется это разрешение, оно может быть предоставлено после его установки и открытия. – SkorpEN 27 February 2018 в 17:42
  • 3

, если вы используете 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
81
ответ дан Alexei 20 August 2018 в 08:14
поделиться
  • 1
    У меня TYPE_SYSTEM_ALERT отлично работает на Android 5.1 с android.permission.SYSTEM_ALERT_WINDOW, предоставленным в манифесте. – Sam 18 May 2016 в 08:27
  • 2
    Я думаю, что это должно быть хорошо для apiLevel & gt; = 23, на самом деле – Beppi's 28 January 2017 в 01:46
  • 3
    Я должен использовать android.permission.SYSTEM_ALERT_WINDOW с LayoutParams.TYPE_TOAST? – t0m 21 February 2017 в 13:38
  • 4
    Я попробовал LayoutParams.TYPE_TOAST. Он работает для меня на Lollipop и Marshmallow и на уровне API 6.0.1. До этого я использовал WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, который работал только для Lollipop. – Prashant 22 February 2017 в 07:39
  • 5
    к сожалению, это вызывает «Обнаружение экрана», если в диалоговом окне разрешения некоторых запросов приложений (если ваше представление активно) – Siarhei 19 April 2017 в 22:04

Я попытался изо всех сил попробовать все примеры, доступные для этой проблемы. Наконец, я получил ответ на этот вопрос, я не знаю, насколько он надежный, но мое приложение сейчас не сбой.

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

40
ответ дан Anam Ansari 20 August 2018 в 08:14
поделиться

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 level 26 или выше.

1
ответ дан Ashiqul Islam 20 August 2018 в 08:14
поделиться

Я предполагаю, что вы должны отличать цель (до и после 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);
37
ответ дан Cédric Dufouil 20 August 2018 в 08:14
поделиться
  • 1
    Я пытаюсь использовать подобную технику, но студия Android не может распознать Build.VERSION_CODES.O & amp; WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY. Моя targetSdkVersion - 26 – Gabe O'Leary 20 February 2018 в 23:06
  • 2
    Цените свою помощь +1 со своей стороны. – Saveen 8 August 2018 в 13:04
  • 3
    – Sagar Hudge 8 October 2018 в 05:54

Мне удалось наконец отобразить окно на экране блокировки с использованием TYPE_SYSTEM_OVERLAY вместо TYPE_KEYGUARD_DIALOG. Это работает так, как ожидалось, и добавляет окно на экран блокировки.

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

Для меня это неприемлемо. Я надеюсь, что это может помочь кому-либо еще столкнуться с этой проблемой.

2
ответ дан DroidPilot 20 August 2018 в 08:14
поделиться

Поиск

Нарисуйте другие приложения

в настройках и включите приложение. Для Android 8 Oreo попробуйте

Настройки> Приложения и amp; Уведомления> Информация о приложении> Показать другие приложения> Включить

2
ответ дан JeffNhan 20 August 2018 в 08:14
поделиться

Для уровня API Android 8.0.0 вы должны использовать

WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

вместо LayoutParams.TYPE_TOAST или TYPE_APPLICATION_PANEL или SYSTEM_ALERT.

6
ответ дан Mingquan Liu 20 August 2018 в 08:14
поделиться

измените флагом флага Windowmanger «TYPE_SYSTEM_OVERLAY» на «TYPE_APPLICATION_OVERLAY» в вашем проекте, чтобы сделать совместимым с android O

WindowManager.LayoutParams.TYPE_PHONE to WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

0
ответ дан Rakesh Kumar B Badiger 20 August 2018 в 08:14
поделиться
0
ответ дан Abhijeet Sharma 31 October 2018 в 07:03
поделиться
2
ответ дан shakirullah orakzai 31 October 2018 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: