Всплывающее окно с входящим звонком - PullRequest
17 голосов
/ 02 января 2012

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

Я знаю, что это возможно, поскольку многие приложения делают это, например, Приложение MeZeZe : enter image description here

Дополнительная информация :

  1. Прозрачная тема не работает, поскольку она отменяет кликабельность предыдущего действия.
  2. Тостне вариант - я не хочу, чтобы он исчез.
  3. Я знаю, что есть много похожих тем - я прочитал многие из них, и ни одна не отвечает на мою конкретную проблему.
  4. Я уже знаю, как«Сделайте что-нибудь», как только вызов получит, так что вам не нужны советы по активности INCOMING_CALL.

Буду признателен за любую помощь!Спасибо

Ответы [ 3 ]

11 голосов
/ 03 января 2012

Если вы хотите, чтобы действие «Вызов» оставалось активным, но у вас не было никаких элементов управления наложением, вы можете сделать это, вызвав

getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

В методе onCreate () отображаемого действиячерез вызов.

Параметры макета, используемые вместе с этим:

android:windowBackground="@android:color/transparent" 
android:windowIsTranslucent="true" 
android:windowAnimationStyle="@android:style/Animation.Translucent"
0 голосов
/ 16 июня 2017

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    win.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

    setContentView(R.layout.activity_main);
0 голосов
/ 17 января 2013

Это сработало для меня с несколькими дополнениями:

В BroadcastReceiver я добавил следующие строки к намерению:

        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Кроме того, я добавил задержку примерно на 1,5 секунды, прежде чемЯ запускаю действие PopupWindow, чтобы убедиться, что оно идет после экрана системы входящих вызовов.

В файле манифеста я добавил:

<activity android:name=".PopUpIncomingCallActivity" 
          android:theme="@android:style/Theme.Translucent">

</activity>

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

В XML-файле макета Popupscreen я добавил следующие свойства:

    android:windowAnimationStyle="@android:style/Animation.Translucent"
    android:windowBackground="@android:color/transparent"
    android:windowIsTranslucent="true"

Однако у этого решения все еще есть недостаток:

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

...