Окно StandOut не отображается во время входящего вызова, когда в Marshmallow установлена ​​защита клавиш

В своем приложении я использую невероятную библиотеку StandOut Марка Вея: http://pingpongboss.github.io/StandOut/

То, что я делаю, очень похоже на приложение TrueCaller.

Который отображает мой собственный вид при входящем звонке. Это вообще отлично работает.

В чем моя проблема?

В очень конкретном случае:

  • Только на Android Marshmallow (6)
  • Когда блокировка ключа включена

Затем окно StandOut приложения отправляется обратно за окном входящего вызова и не отображается, за исключением мерцания на долю секунды.

Что я пробовал?

Использование обоих этих флагов вместе:

  • FLAG_DISMISS_KEYGUARD
  • FLAG_SHOW_WHEN_LOCKED

Кроме того (и отдельно) я попробовал этот устаревший способ:

KeyguardManager.KeyguardLock mLock;
KeyguardManager mKeyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE);
mLock = mKeyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
mLock.disableKeyguard();

Когда это также не удалось, я попытался предоставить своему приложению права администратора (я не буду добавлять весь код, чтобы сделать это, поскольку он длинный, но я сделал это правильно), а затем попробовал следующее:

devicePolicyManager.setKeyguardDisabled(deviceAdmin,true);

ПРИМЕЧАНИЕ. Я хочу еще раз подчеркнуть, что знаю, что это возможно, поскольку приложение TrueCaller делает это так хорошо и не терпит неудачу при каждом вызове. Просто нужна помощь, чтобы найти правильный способ сделать это.

Заранее спасибо!


person Nom1fan    schedule 12.06.2016    source источник


Ответы (2)


У меня есть три предложения, которые вы можете попробовать (не уверен, что они сработают), но их стоит попробовать.

  1. попробуйте добавить эти флаги:

    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    
  2. попробуйте добавить задержку, скажем, 2 секунды, прежде чем вы запустите действие окна StandOut, чтобы убедиться, что оно идет после экрана системы входящего вызова (позже, если это решит проблему, уменьшите задержку как можно больше).

  3. Также нашел этот ответ здесь, не уверен, что у вас есть доступ к свойствам окна, но видел это решение:

    «Мы также столкнулись с похожей проблемой, когда оверлей не отображался на устройстве с блокировкой пин-кодом. Решение, которое сработало для нас, приведено ниже:

    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mParams = new LayoutParams(
            LayoutParams.MATCH_PARENT,
            LayoutParams.WRAP_CONTENT,
            LayoutParams.TYPE_SYSTEM_ERROR,
            LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);
    

    It was

    LayoutParams.TYPE_SYSTEM_ERROR
    that made the difference."

    Аналогичный вопрос: Всплывающее окно поверх встроенного экрана входящего вызова Android, как в Android-приложении True Caller

Надеюсь, что-то здесь будет вам полезно, пожалуйста, обновите, если проблема решена.

ОБНОВЛЕНИЕ: проблема была решена: (добавление этого):

LayoutParams.TYPE_SYSTEM_ERROR

Просто не забудьте добавить это до того, как макет будет раздут, иначе он ничего не сделает.

person Jhonny    schedule 16.06.2016
comment
Привет! Спасибо за ваш ответ. Я обязательно пойду дальше, чтобы попробовать ваши предложения. Одна вещь, о которой я, возможно, забыл упомянуть, заключается в том, что мне нужно, чтобы и мое представление, и собственное представление были сенсорными. В противном случае, если, например, доступен только мой вид, пользователь не может отвечать на звонки! Что конечно очень плохо. Я постараюсь обновить позже. Спасибо. - person Nom1fan; 17.06.2016
comment
я буду рад получить обновление, было ли оно полезно для решения. - person Jhonny; 20.06.2016
comment
Привет, Джонни, мы пробовали все комбинации TYPE_SYSTEM_ERROR, а также TYPE_SYSTEM_ALERT, и это просто не имело значения на Android 6 с включенной защитой клавиш. Каким-то образом TrueCaller удалось обойти защиту клавиш и даже над всплывающим окном входящего вызова. До сих пор не знаю, как они это делают. - person Nom1fan; 21.06.2016
comment
Вы пытались поставить задержку, я думаю, может быть, это ключ к разыскиваемому поведению. - person Jhonny; 22.06.2016
comment
Да, пробовали и с разными задержками, но не помогло. В настоящее время мы платим внешней компании по разработке решений, и они усердно работают над этим. Буду обновлять, если найдут решение. - person Nom1fan; 26.06.2016
comment
Хорошо решено. Большое спасибо за ответ. В конце концов проблема заключалась в том, что мы добавили TYPE_SYSTEM_ERROR не в нужное место (во время сборки), а после того, как макет уже был раздут. Теперь мы добавили в нужное место, и это прекрасно работает. - person Nom1fan; 27.06.2016
comment
О две вещи здесь, которые были неправильно поняты. во-первых, я думал, что вы поняли, куда добавить этот флаг, я исправлю ответ, чтобы другим было понятнее. во-вторых, я думал, что вы понимаете, что Дрор послал меня, чтобы помочь вам здесь, я Джонни, технический директор компании по разработке мобильных приложений GRapps (grapps. io), вы поговорили с ним и попросили нашего совета по этому вопросу, в любом случае, рад, что вы решили это, и надеюсь, что теперь это работает для вас. не стесняйтесь обращаться к нам в будущем, если вам нужна наша помощь в развитии. - person Jhonny; 27.06.2016
comment
Где вы добавляете LayoutParams.TYPE_SYSTEM_ERROR? Я просто показываю отдельное окно, используя функцию статического показа, например: StandoutWIndow.show(context, <classname>, <ID>). Куда добавить LayoutParams.TYPE_SYSTEM_ERROR? - person Metal; 29.11.2016
comment
Если я должен добавить его в файл Windows, то где именно? Я могу добавить его только после раздувания моего макета. - person Metal; 29.11.2016

Привет, у меня та же проблема... я пытаюсь создать приложение, которое выводит всплывающее окно активности при входящем и исходящем звонке...

мое приложение работает хорошо, за исключением Android 6 и когда активен «KEYGUARD».

я попробовал какой-то метод, который мог бы помочь вам найти решение

я пытался использовать оконный менеджер с (TYPE_SYSTEM_ERROR) и раздувать макет, чтобы показать экран поверх входящего вызова, он успешно сработал, и показать макет поверх экрана системного вызова Android 6, но я обнаружил еще одну проблему с этим ..

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

Кстати, я нашел приложение, которое вы и я пытаетесь сделать, вы можете найти его здесь: Темы идентификации экрана вызывающего абонента OS9

Я надеюсь, что это может помочь вам.

обновите, если найдете решение

извините за мой плохой английский

person m.r.davari    schedule 26.06.2016
comment
Спасибо за ответы. Я не уверен, почему вы испытываете это. Мы также в конечном итоге решили проблему с помощью TYPE_SYSTEM_ERROR, и мы не сталкиваемся с тем, что вы описываете, когда не работают прослушиватели кликов. - person Nom1fan; 27.06.2016
comment
@ Nom1fan Я тоже не знаю ... мое приложение работает нормально, за исключением Android 6, и я отлично работаю в Android 6 без защищенной защиты клавиатуры ... У меня есть 2 небольших вопроса 1: вы использовали сервис или действие для всплывающего окна поверх входящих вызов?! 2: вы преуспели в Android 6 с безопасной защитой клавиатуры? не могли бы вы опубликовать часть своего кода, пожалуйста, спасибо, друг - person m.r.davari; 28.06.2016
comment
1. Я использую сервис, использующий WindowManager. 2. Вы можете увидеть код в ответе, который я принял выше. Это тот же код, что и в моем приложении. - person Nom1fan; 28.06.2016
comment
@ Nom1fan Спасибо за ответ. Я использую тот же код ... Я обновлю, если найду способ решить эту проблему. - person m.r.davari; 28.06.2016
comment
Где вы добавляете LayoutParams.TYPE_SYSTEM_ERROR? Я просто показываю отдельное окно, используя функцию статического показа, например: StandoutWIndow.show(context, <classname>, <ID>). Куда добавить LayoutParams.TYPE_SYSTEM_ERROR? - person Metal; 29.11.2016