Для того чтобы сенсорные события регистрировались на дополнительном дисплее (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 и выполните следующие действия:
- включите параметры разработчика,
- в параметрах разработчика, включите следующие 4 параметра: Принудительное изменение размера всех действий, Freeform Windows, Force Desktopи Simulate Secondary Display (не имеет значения, какая опция выбрана для имитации вторичного дисплея),
- перезагрузите устройство,
- подключите к нему мышь.Мышь появится и застрянет внутри наложенного окна, которое "имитирует дополнительный дисплей".Это будет обрабатывать сенсорные события.
В будущем появятся эмуляторы с несколькими дисплеями для лучшего тестирования приложений с несколькими дисплеями, но на данный момент это недоступно.