Android плавающее окно со скрытой строкой состояния Проблемы с доступностью
Я работаю на Android 4.4.2, создавая приложение с системным оверлеем / плавающим окном, созданным сервисом специальных возможностей.
Редактировать: я хочу иметь возможность скрыть строку состояния ГЛОБАЛЬНО (в любом приложении) (стало возможным с помощью кода ниже), однако, когда отображается наложение, я прекращаю получать acessibilityEvents от слушателя и кнопку возврата программного / аппаратного обеспечения, когда плавающее представление вводится в оконный менеджер:
- Прослушиватель AccessibilityEvent не получает обновления
- Программная / аппаратная клавиша возврата не регистрируется (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"
/>
2 ответа
После долгих часов и недели исследований я обнаружил, что из-за ограничений безопасности нет возможности сделать оба эти варианта. Я буду внедрять эти функции в корневой режим моего приложения.
Обходной путь, который я использую, - простая кнопка, которая восстанавливает системный интерфейс и удаляет представление, которое блокирует ввод специальных возможностей.
Эй, я думаю, что это будет работать!!!!
Вам просто нужно правильно установить свойство ширины WindowManager.LayoutParams. Таким образом, вы можете получать acessibilityEvents от слушателя и кнопку возврата программного / аппаратного обеспечения.
Попробуй это
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;
}