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);