【问题标题】:Android floating window with hidden statusbar Accessibility problems带有隐藏状态栏的Android浮动窗口可访问性问题
【发布时间】:2017-11-27 18:53:44
【问题描述】:

我正在使用 android 4.4.2 构建一个应用程序,该应用程序具有由无障碍服务创建的系统覆盖/浮动窗口。

编辑:我希望能够全局隐藏状态栏(在任何应用程序中)(通过下面的代码实现)但是当显示覆盖时,我停止从侦听器接收 acessibilityEvents 并且软件/硬件返回按钮 当浮动视图注入到windowmanager中时:

  1. AccessibilityEvent 侦听器未收到更新
  2. 软/硬件返回键未注册(home/recents 已注册)

为了隐藏状态栏两者'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"
    />

【问题讨论】:

  • 感谢@SainathPatwarykarnate 我不能使用标志 NOT_FOCUSABLE 因为它不允许我在任何应用程序中隐藏状态栏

标签: android accessibility android-4.4-kitkat android-fullscreen


【解决方案1】:

嘿,我认为这会工作!!!!

您只需要正确设置 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;
}

【讨论】:

  • 找不到类StatusBarOverlayView
【解决方案2】:

经过长时间的研究和一周的研究,我发现由于安全限制,无法同时执行这两项操作。我将在我的应用程序的根模式下实现这些功能。

我正在使用的解决方法是一个简单的按钮,它可以恢复系统 ui 并删除阻碍可访问性输入的视图

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多