isActivityStartAllowedOnDisplay () метод - PullRequest
0 голосов
/ 06 июня 2019

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

При использовании Android Pie при запуске действия на некоторых вторых дисплеях возникает исключение безопасности. Google недавно выпустил этот новый API для Android Q - isActivityStartAllowedOnDisplay () (https://developer.android.com/reference/android/app/ActivityManager.html#isActivityStartAllowedOnDisplay(android.content.Context,%2520int,%2520android.content.Intent))), чтобы иметь возможность определить, есть ли на втором дисплее это исключение безопасности.

Этот новый API полезен, НО, есть ли способ обойти это? Может быть, я неправильно понял документацию, но кажется, что если устройство не поддерживает его, то нет никакого способа обойти это. Кто-нибудь знает какие-либо дисплеи, которые НЕ выдают это исключение безопасности?

1 Ответ

1 голос
/ 26 июня 2019

Для того чтобы сенсорные события регистрировались на дополнительном дисплее (GeChic Touch Monitor), у меня было устройство DisplayLink, подключенное между устройством Android и сенсорным дисплеем.В этот момент он отображал изображение на телефоне / планшете, но обрабатывал события касания.Итак, я написал приложение, которое будет пытаться запустить второе действие на втором дисплее, используя этот код на Android Pie OS:

DisplayManager mgr = (DisplayManager) this.getBaseContext().getSystemService(Context.DISPLAY_SERVICE);

if (mgr != null) {
    Display[] displays = mgr.getDisplays();

    for (int i = 0; i < displays.length; i++) {
        Display display = displays[i];
        Point point = new Point();
        display.getSize(point);

        if (point.y == PX_HEIGHT_OF_SECONDARY_DISPLAY || point.x == PX_HEIGHT_OF_SECONDARY_DISPLAY) {
            Context displayContext = createDisplayContext(display);
            Intent newIntent = new Intent(displayContext, ActivityCID.class);

            ActivityOptions options = ActivityOptions.makeBasic();
            options.setLaunchDisplayId(display.getDisplayId());
            newIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent, options.toBundle());
            return;
        }
    }
}

Обратите внимание, что я не использовал display.getDisplayId () и сделал хакерскийпуть со значениями point.y и point.x с шириной или высотой пикселя, которые не соответствуют ширине или высоте пикселя телефона / планшета Android.DisplayId () не всегда был непротиворечивым значением, которое «должно» быть стабильным в Android Q. Здесь происходит сбой приложения, и второе действие завершается с ошибкой разрешений безопасности.Итак, я использовал Android Q Beta для тестирования нового API isActivityStartAllowedOnDisplay ().Я запустил это через Android Studio на телефон (который был на Android Q Beta OS), чтобы запустить его, и неудивительно, что вторичный дисплей вернулся ложным.Смотрите код ниже:

public void launchOnSecondaryDisplay(Display display) {

    Context displayContext = createDisplayContext(display);
    Intent newIntent = new Intent(displayContext, ActivityTest.class);

    ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Activity.ACTIVITY_SERVICE);
        if (activityManager != null) {
            boolean allowsDisplay = activityManager.isActivityStartAllowedOnDisplay(displayContext, display.getDisplayId(), newIntent);

            if (allowsDisplay) {
                ActivityOptions options = ActivityOptions.makeBasic();
                options.setLaunchDisplayId(display.getDisplayId());
                newIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(newIntent, options.toBundle());
            } else {
                Toast.makeText(this, "Cannot start activity on that display as it is not supported.", Toast.LENGTH_LONG).show();
            }

        }
    }

Я решил попробовать это через командную строку.После подключения физического устройства к сети, к которой подключен мой Mac, я смог подключиться к телефону по беспроводной сети и внести изменения в adb.Используя команду adb, я смог получить дополнительную активность на дополнительном дисплее!Казалось, работает!Но нет, это не было ... События касания все еще продолжали действовать, как будто устройство зеркально отображалось, так что это все еще было проблемой и не собиралось работать.

Я также обсуждал это с Googler и объяснил, что root adb может переопределить эти разрешения.Однако до сих пор не было способа заставить сенсорные события сопоставляться со вторым действием на дополнительном дисплее.

На момент написания этого документа единственный поддерживаемый способ тестирования сенсорных дисплеев - это использование физическогоустройство под управлением Android Q Beta и выполните следующие действия:

  1. включите параметры разработчика,
  2. в параметрах разработчика, включите следующие 4 параметра: Принудительное изменение размера всех действий, Freeform Windows, Force Desktopи Simulate Secondary Display (не имеет значения, какая опция выбрана для имитации вторичного дисплея),
  3. перезагрузите устройство,
  4. подключите к нему мышь.Мышь появится и застрянет внутри наложенного окна, которое "имитирует дополнительный дисплей".Это будет обрабатывать сенсорные события.

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

...