При добавлении вида в окно с помощью WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY событие касания не отображается

1

Мне нужно отобразить мой вид поверх приложения для набора номера, поэтому для этой цели я использовал TYPE_PHONE, который можно прикоснуться, но все же на некоторых устройствах, таких как приложение для набора номера Nexus 5, его скрывает.

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

Теги:
android-layout

1 ответ

6
Лучший ответ

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

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                        WindowManager.LayoutParams.MATCH_PARENT,
                        WindowManager.LayoutParams.WRAP_CONTENT,
                        WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                        PixelFormat.TRANSPARENT);

params.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(view, params);
  • 0
    Получение ошибки: «Вызвано: android.view.WindowManager $ BadTokenException: невозможно добавить окно android.view.ViewRootImpl$W@d46dbf4 - в этом типе окна отказано в разрешении» OS 6.0 Marshmallow
  • 0
    @AhmadShahwaiz Для добавления вида в окно мы должны упомянуть разрешение системного уровня android.permission.SYSTEM_ALERT_WINDOW в манифесте. А в Os 6.0 Marshmallow мы должны запросить разрешения во время выполнения, прежде чем добавлять представление к окну, как показано ниже (поскольку это разрешение системы) if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, OVERLAY_REQ_CODE); }
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню