از 27 مارس 2025، توصیه می کنیم از android-latest-release
به جای aosp-main
برای ساختن و کمک به AOSP استفاده کنید. برای اطلاعات بیشتر، به تغییرات AOSP مراجعه کنید.
مسیریابی ورودی
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
در اندروید 9 و پایین تر، هیچ راهی برای تعامل با چندین نمایشگر از طریق لمس وجود نداشت، زیرا هیچ مکانیزم ارتباطی بین نمایشگرها و دستگاه های ورودی وجود نداشت. به عنوان مثال، یک صفحه نمایش لمسی می تواند یک خروجی ویدیوی HDMI (که به عنوان نمایشگر در اندروید ثبت می شود) و یک خروجی USB برای صفحه نمایش لمسی (که به عنوان یک دستگاه ورودی ثبت می شود) ارائه دهد. اگر چندین دستگاه به این روش متصل شده باشند، هیچ راهی برای تعیین اینکه کدام دستگاه ورودی متعلق به کدام نمایشگر است وجود نخواهد داشت. همین مسئله در مورد دستگاه های تاشو با نمایشگرهای داخلی متعدد نیز صدق می کند.
اندروید 10 مکانیزمی را اضافه کرد تا مشخص کند کدام دستگاه ورودی متعلق به کدام نمایشگر است. ارتباط توسط شماره پورت انجام می شود که در آن پورت به پورت فیزیکی که نمایشگر به آن متصل است اشاره دارد.
به عنوان مثال، اگر یک دستگاه اندرویدی دارای دو پورت HDMI با برچسب hdmi1
و hdmi2
باشد، آنگاه مقادیر پورت نمایشگر می تواند 1
و 2
باشد. مقادیر پورت حتی زمانی که نمایشگر دیگری (مانند مدل یا سازنده نمایشگر متفاوت) به همان پورت فیزیکی HDMI متصل است، ثابت می ماند. این به سازندگان دستگاه امکان می دهد تا دستورالعمل هایی را برای جمع آوری و ارتقاء نمایشگرها ارائه دهند.
ارتباط در /vendor/etc/input-port-associations.xml
پیکربندی شده است. به عنوان مثال:
<ports>
<port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
<port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>
در مثال بالا، display="0"
پورتی را که نمایشگر به آن متصل است مشخص می کند. input="usb-xhci-hcd.0.auto-1.1/input0"
پورتی را که دستگاه ورودی به آن متصل است را مشخص می کند. برای تعیین پورتهای مرتبط با دستگاههای خاص، از دستور ترمینال زیر استفاده کنید و سپس ویژگی location
آن دستگاهها را در Event Hub State بررسی کنید.
adb shell dumpsys input
اگر دستگاههای زیادی متصل هستند، روی یک دستگاه خاص ضربه بزنید تا آرایه RecentQueue
را در وضعیت Dispatcher ورودی بررسی کنید. سپس می توانید دستگاه هایی را که جدیدترین رویداد را ایجاد کرده اند شناسایی کنید. سپس می توانید دستگاه مربوطه را در Event Hub State پیدا کنید.
برای تعیین پورت های نمایش اختصاص داده شده به نمایشگرهای متصل، از adb shell dumpsys display
استفاده کنید و سپس به دنبال ویژگی address
DisplayDeviceInfo
برای هر نمایشگر در قسمت Display Devices بگردید. روش دیگر، از adb shell dumpsys SurfaceFlinger --display-id
برای تخلیه اطلاعات شناسایی برای همه نمایشگرهای متصل استفاده کنید. همچنین به شناسه های نمایشگر استاتیک مراجعه کنید.
اگر ارتباطی را برای یک دستگاه ورودی خاص مشخص کنید و نمایشگر مربوطه در سیستم وجود نداشته باشد، دستگاه ورودی غیرفعال می شود تا زمانی که نمایشگر مربوطه ظاهر شود. ارتباط فقط برای دستگاه های لمسی انجام می شود.
مسیریابی برای چند نمایشگر پویا
اندروید 10 به شما امکان میدهد دستگاههای چند صفحهنمایش ثابت را تنظیم کنید. پیوندهای پویا هنوز فعال نشده اند. با این حال، برخی از موارد استفاده را می توان با ارائه اطلاعات مسیریابی برای نمایشگرها و پانل های ورودی که همیشه وجود ندارند یا با استفاده از دستگاه های ورودی مجازی و سپس ارائه اطلاعات مسیریابی اضافی به آن دستگاه های مجازی برطرف کرد. اگر پیاده سازی دستگاه از یک زیر پشتیبانی کند:
- تجربه ای شبیه به دسکتاپ با یک ایستگاه اتصال، سپس یک پیکربندی مسیریابی می تواند برای هدف قرار دادن ورودی از لوازم جانبی ورودی متصل به داک (که منحصراً توسط پورت مشخص می شود) به صفحه نمایش خارجی (شناسایی شده توسط پورت) ارائه شود.
- صفحه اصلی که به عنوان منبع ورودی (مانند تاچ پد) هنگام اتصال به صفحه نمایش خارجی عمل می کند، سپس یک پیکربندی مسیریابی می تواند برای هدف قرار دادن ورودی از پنل لمسی مجازی (شناسایی شده توسط شناسه مجازی منحصر به فرد) به صفحه نمایش خارجی (شناسایی شده توسط پورت) ارائه شود.
پیاده سازی
- برای دستگاه های فیزیکی، درگاهی که دستگاه ورودی به آن متصل است و پورتی که نمایشگر به آن متصل است، برای تطبیق نمایشگرها با صفحه نمایش لمسی استفاده می شود.
- نگاشتها در
InputReaderConfiguration
ذخیره می شوند. -
TouchInputMapper.mViewport
روی درگاه نمایشی تنظیم شده است که با پورت مشخص شده برای InputDevice.location
مطابقت دارد. - اگر یک پورت دستگاه ورودی در فایل نگاشت مشخص شده باشد، و در حال حاضر یک درگاه نمایشی وجود نداشته باشد که دارای یک پورت نمایش منطبق باشد، دستگاه ورودی در آن پورت غیرفعال می شود.
- اگر یک پورت برای یک دستگاه ورودی خاص مشخص نشده باشد، آنگاه viewport طبق قوانین موجود تنظیم می شود.
- هیچ تغییری در کرنل در درایورهای ورودی لازم نیست.
- پورت های دستگاه ورودی با استفاده از EVIOCGPHYS ioctl تعیین می شوند.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Input routing\n\nIn Android 9 and lower, there was no way to interact with multiple displays\nvia touch, because there was no association mechanism between displays and input\ndevices. For example, a touchscreen display could provide an HDMI video output\n(that would register as a display on Android) and a USB output for touchscreen\n(that would register as an input device). If multiple devices were connected in\nthis manner, there would be no way to determine which input device belongs to\nwhich display. The same issue applies to foldable devices with multiple built-in\ndisplays.\n\nAndroid 10 added a mechanism to specify which input\ndevices belong to which displays. The association is done by port numbers where\n*port* refers to the physical port to which a display is connected.\n\nFor example, if an Android device has two HDMI ports labeled `hdmi1`\nand `hdmi2`, then the display port values could be `1` and\n`2`. The port values remain the same even when a different display is\nconnected (such as a different display model or manufacturer) to the same physical\nHDMI port. This enables device manufacturers to provide instructions to assemble\nand upgrade displays.\n\nThe association is configured in `/vendor/etc/input-port-associations.xml`.\nFor example: \n\n \u003cports\u003e\n \u003cport display=\"0\" input=\"usb-xhci-hcd.0.auto-1.1/input0\" /\u003e\n \u003cport display=\"1\" input=\"usb-xhci-hcd.0.auto-1.2/input0\" /\u003e\n \u003c/ports\u003e\n\nIn the example above, `display=\"0\"` specifies the port to which the\ndisplay is connected. `input=\"usb-xhci-hcd.0.auto-1.1/input0\"`\nspecifies the port to which the input device is connected. To determine the ports\nassociated with specific devices, use the following terminal command, and then\nreview the`location` property of those devices in the Event Hub State. \n\n```\nadb shell dumpsys input\n```\n\nIf many devices are connected, tap a specific device to examine the\n`RecentQueue` array in the Input Dispatcher State. You can then identify\nthose devices that generated the most recent event. You can then find the\ncorresponding device in the Event Hub State.\n\nTo determine the display ports assigned to the connected displays, use\n`adb shell dumpsys display` and then look for the `address`\nproperty of `DisplayDeviceInfo` for each display under Display Devices.\nAlternatively, use `adb shell dumpsys SurfaceFlinger --display-id` to dump\nidentification information for all connected displays. See also\n[Static display identifiers](/docs/core/display/multi_display/displays#static).\n\nIf you specify an association for a specific input device and the corresponding\ndisplay isn't present in the system, the input device is disabled until the respective\ndisplay appears. The association is performed only for touch devices.\n\nRouting for dynamic multi-displays\n----------------------------------\n\nAndroid 10 enables you to set up static multi-display\ndevices. Dynamic associations are not yet enabled. However, some use cases can be\naddressed by providing routing information for displays and input panels that aren't\nalways present or using virtual input devices and then providing additional routing\ninformation to those virtual devices. If a device implementation supports a:\n\n- Desktop-like experience with a docking station, then a routing config could be provided to target input from input accessory connected to the dock (identified uniquely by port) to the external display (identified by port).\n- Primary screen acting as an input source (such as a touchpad) when connected to the external display, then a routing config could be provided to target input from virtual touch panel (identified by unique virtual ID) to the external display (identified by port).\n\n### Implementation\n\n- For physical devices, the port to which the input device is connected and the port to which the display is connected, are used to match the displays with touchscreens.\n- The mappings are stored in `InputReaderConfiguration`.\n- `TouchInputMapper.mViewport` is set to the viewport that matches the port specified for `InputDevice.location`.\n- If an input device port is specified in the mapping file, and there currently isn't a viewport that has a matching display port, then the input device on that port is disabled.\n- If a port isn't specified for a particular input device, then viewport is set according to the existing rules.\n- No kernel changes are required in the input drivers.\n- The input device ports are determined using the EVIOCGPHYS ioctl."]]