WindowManager не всегда может рисовать сверху

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

Проблема в том, что на некоторых устройствах это окно не отображается, если экран устройства отключен до того, как телефон зазвонит (если экран устройства включен, когда звонит телефон, отображается окно). Я также задерживаю рисование окна на 3 секунды, но это, похоже, не работает.

Для отображения окна я использую следующий код, где mView это RelativeLayout с TextView, Этот код работает в Service,

WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            dpToPx(72),
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);

mParams.gravity = Gravity.TOP;
WindowManager mWindowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mView, mParams);

2 ответа

После нескольких неудачных попыток я нашел это.

Я должен был заменить флаг TYPE_PHONEс TYPE_SYSTEM_OVERLAY,

Попробуйте это, это обязательно сработает

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Layout_Flag = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        Layout_Flag = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    }
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        Layout_Flag = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    }
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            Layout_Flag,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.CENTER;
    mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    try {
        mWindowManager.addView(windowView, params);
Другие вопросы по тегам