Плавающее окно Android со скрытой строкой состояния Проблемы с доступностью

Я работаю над Android 4.4.2, создавая приложение с системным наложением/плавающим окном, созданным службой специальных возможностей.

Изменить:Я хочу иметь возможность скрывать строку состояния ГЛОБАЛЬНО (в любом приложении) (это стало возможным благодаря приведенному ниже коду), однако, когда отображается наложение, я перестаю получать события доступности от слушателя и программного обеспечения/ аппаратная кнопка «Назад» Когда плавающий вид внедряется в оконный менеджер:

  1. Прослушиватель AccessibilityEvent не получает обновления
  2. Программный/аппаратный ключ возврата не регистрируется (домой/последние регистрируются)

чтобы скрыть строку состояния как 'FLAG_FULLSCREEN | FLAG_NOT_TOUCH_MODAL' необходимы, чтобы разрешить касание остальной части экрана, а 'View.SYSTEM_UI_FLAG_FULLSCREEN' позволяет

Служба специальных возможностей (при подключенном методе):

  @Override
    public void onServiceConnected() {
        serviceInstance = this;
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        FloatingView = new View(this);

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                0, 0,
                0, 0,
                TYPE_PRIORITY_PHONE,
                FLAG_FULLSCREEN | FLAG_NOT_TOUCH_MODAL, PixelFormat.OPAQUE);
        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
        params.windowAnimations = android.R.style.Animation_Toast;
        params.gravity = Gravity.BOTTOM | Gravity.RIGHT;

            windowManager.addView(FloatingView, params);

 int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
  FloatingView.setSystemUiVisibility(uiOptions);

        }

Служба специальных возможностей (при подключенном методе):

@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    Log.i("","Just log me some rubbish");

}

Мой AccessibilitySetup.xml:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:notificationTimeout="0"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/notification_description"
    />

person LOGMD    schedule 12.05.2014    source источник
comment
спасибо @SainathPatwarykarnate, я не могу использовать флаг NOT_FOCUSABLE, потому что он не позволяет мне скрыть строку состояния в любом приложении.   -  person LOGMD    schedule 12.05.2014


Ответы (2)


Эй, я думаю, это сработает!!!!

Вам просто нужно правильно установить свойство ширины WindowManager.LayoutParams. Благодаря этому вы можете получать события доступности от слушателя и кнопку возврата программного/аппаратного обеспечения.

Попробуй это

WindowManager manager = ((WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));
    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
    localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
    localLayoutParams.gravity = Gravity.TOP;
    localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
            // this is to enable the notification to receive touch events
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
            // Draws over status bar
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
    localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
    localLayoutParams.height = retrieveStatusBarHeight(context);
    localLayoutParams.format = PixelFormat.TRANSPARENT;
    StatusBarOverlayView view = new StatusBarOverlayView(context);
    manager.addView(view, localLayoutParams);

public static int retrieveStatusBarHeight(Context context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}
person Amit Vaishnava    schedule 27.11.2017
comment
не могу найти класс StatusBarOverlayView - person Duna; 21.11.2018

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

обходной путь, который я использую, — это простая кнопка, которая восстанавливает системный пользовательский интерфейс и удаляет представление, которое блокирует ввод специальных возможностей.

person LOGMD    schedule 19.05.2014