میتوانید از عملکرد مکان Wi-Fi ارائهشده توسط Wi-Fi RTT (Round-Trip-Time) API برای اندازهگیری فاصله تا نقاط دسترسی Wi-Fi با قابلیت RTT و دستگاههای همتا Wi-Fi Aware استفاده کنید.
اگر فاصله تا سه نقطه دسترسی یا بیشتر را اندازهگیری کنید، میتوانید از الگوریتم چندجانبهگرایی برای تخمین موقعیت دستگاهی که با آن اندازهگیریها مطابقت دارد استفاده کنید. نتیجه معمولاً با دقت ۱ تا ۲ متر صحیح است.
با این دقت، میتوانید خدمات مکانمبنای دقیقتری توسعه دهید، مانند ناوبری داخلی، کنترل صوتی بدون ابهام (برای مثال، «این چراغ را روشن کن»)، و اطلاعات مکانمبنا (برای مثال، «آیا پیشنهادهای ویژهای برای این محصول وجود دارد؟»).
دستگاه درخواستکننده برای اندازهگیری فاصله با Wi-Fi RTT نیازی به اتصال به نقاط دسترسی ندارد. برای حفظ حریم خصوصی، فقط دستگاه درخواستکننده میتواند فاصله تا نقطه دسترسی را تعیین کند؛ نقاط دسترسی این اطلاعات را ندارند. عملیات Wi-Fi RTT برای برنامههای پیشزمینه نامحدود است اما برای برنامههای پسزمینه محدود میشود.
Wi-Fi RTT و قابلیتهای مرتبط اندازهگیری زمان دقیق (FTM) توسط استاندارد IEEE 802.11-2016 مشخص شدهاند. Wi-Fi RTT به اندازهگیری دقیق زمان ارائهشده توسط FTM نیاز دارد، زیرا فاصله بین دو دستگاه را با اندازهگیری زمان رفتوبرگشت بسته بین دستگاهها و ضرب کردن آن زمان در سرعت نور محاسبه میکند.
Android 15 (سطح API ۳۵) پشتیبانی از محدوده غیرمحرک (NTB) IEEE 802.11az را معرفی کرد.
تفاوتهای پیادهسازی براساس نسخه Android
Wi-Fi RTT در Android 9 (سطح میانای برنامهسازی کاربردی ۲۸) معرفی شد. هنگام استفاده از این پروتکل برای تعیین موقعیت دستگاه بااستفاده از چندجانبهگرایی با دستگاههای دارای Android 9، باید به دادههای مکان نقطه دسترسی (AP) ازپیش تعیینشده در برنامهتان دسترسی داشته باشید. تصمیمگیری درباره نحوه ذخیره و بازیابی این دادهها برعهده شما است.
در دستگاههای دارای Android نسخه ۱۰ (سطح میانای برنامهسازی کاربردی ۲۹) و بالاتر، دادههای مکان نقطه دسترسی را میتوان بهصورت اشیاء ResponderLocation نشان داد که شامل عرض جغرافیایی، طول جغرافیایی، و ارتفاع است. برای نقاط دسترسی Wi-Fi RTT که از «اطلاعات پیکربندی مکان»
یا «گزارش مدنی مکان» (دادههای LCI یا LCR) پشتیبانی میکنند، پروتکل درطول
فرایند تعیین محدوده، شیء ResponderLocation را برمیگرداند.
برنامهها میتوانند بهجای ذخیره کردن موقعیت نقاط دسترسی ازقبل، مستقیماً موقعیت آنها را جستجو کنند. برنامه شما میتواند نقاط دسترسی را پیدا کند و موقعیت آنها را تعیین کند، حتی اگر قبلاً ناشناخته بوده باشند، مثلاً وقتی کاربر وارد ساختمان جدیدی میشود.
پشتیبانی از محدوده IEEE 802.11az NTB در دستگاههای دارای Android 15 (سطح API ۳۵) و بالاتر دردسترس است. یعنی اگر دستگاه از حالت آغازگر NTB در IEEE 802.11az پشتیبانی کند (که با WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_NTB_INITIATOR نشان داده میشود)، برنامه شما میتواند با یک درخواست محدوده، هر دو نقطه دسترسی سازگار با IEEE 802.11mc و IEEE 802.11az را پیدا کند.
RangingResult API گسترش یافته است تا اطلاعاتی درباره حداقل و حداکثر مقداری که میتواند برای فاصله بین اندازهگیریهای فاصلهیابی استفاده شود ارائه دهد، و فاصله دقیق را تحت کنترل برنامه شما قرار دهد.
الزامات
- سختافزار دستگاهی که درخواست فاصلهیابی را ارائه میدهد باید استاندارد FTM 802.11-2016 یا استاندارد 802.11az (فاصلهیابی غیرمبتنی بر راهانداز) را پیادهسازی کند.
- دستگاهی که درخواست فاصلهیابی را ارسال میکند باید Android 9 (سطح میانای برنامهسازی کاربردی ۲۸) یا بالاتر داشته باشد. محدوده غیرمبتنی بر راهانداز IEEE 802.11az در دستگاههای دارای Android 15 (سطح میانای برنامهسازی کاربردی ۳۵) و بالاتر فعال است.
- دستگاهی که درخواست فاصلهیابی را ارسال میکند باید خدمات مکان را فعال کرده باشد و اسکن Wi-Fi را روشن کرده باشد (در تنظیمات > مکان).
- اگر برنامهای که درخواست فاصلهیابی را ارائه میدهد، Android 13 (سطح میانای برنامهسازی کاربردی ۳۳) یا بالاتر را هدف قرار دهد، باید اجازه
NEARBY_WIFI_DEVICESرا داشته باشد. اگر چنین برنامهای نسخه پایینتری از Android را هدف قرار دهد، باید بهجای آن اجازهACCESS_FINE_LOCATIONرا داشته باشد. - برنامه باید محدوده نقاط دسترسی را زمانیکه برنامه نمایان است یا در سرویس پیشزمینه قرار دارد پُرسمان کند. برنامه نمیتواند در پسزمینه به اطلاعات مکان دسترسی داشته باشد.
- نقطه دسترسی باید استاندارد IEEE 802.11-2016 FTM یا استاندارد IEEE 802.11az (محدوده غیرمبتنی بر راهانداز) را پیادهسازی کند.
راهاندازی
برای راهاندازی برنامهتان جهت استفاده از Wi-Fi RTT، مراحل زیر را انجام دهید.
۱. درخواست اجازهها
اجازههای زیر را در مانیفست برنامهتان درخواست کنید:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- If your app targets Android 13 (API level 33)
or higher, you must declare the NEARBY_WIFI_DEVICES permission. -->
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
<!-- If your app derives location information from Wi-Fi APIs,
don't include the "usesPermissionFlags" attribute. -->
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
<!-- If any feature in your app relies on precise location
information, don't include the "maxSdkVersion"
attribute. -->
android:maxSdkVersion="32" />
اجازههای NEARBY_WIFI_DEVICES و ACCESS_FINE_LOCATION اجازههای خطرناکی هستند، بنابراین هربار که کاربر میخواهد عملیات اسکن RTT را انجام دهد، باید آنها را در زمان اجرا درخواست کنید. اگر اجازه قبلاً اعطا نشده باشد، برنامه شما باید از کاربر درخواست اجازه کند. برای اطلاعات بیشتر
درباره اجازههای زمان اجرا، درخواست اجازههای برنامه را ببینید.
۲. بررسی اینکه دستگاه از Wi-Fi RTT پشتیبانی میکند یا نه
برای بررسی اینکه دستگاه از Wi-Fi RTT پشتیبانی میکند یا نه، از میانای برنامهسازی کاربردی PackageManager استفاده کنید:
کاتلین
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)
جاوا
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
۳. بررسی کنید آیا Wi-Fi RTT دردسترس است یا نه
Wi-Fi RTT ممکن است در دستگاه وجود داشته باشد، اما ممکن است دردسترس نباشد زیرا کاربر
Wi-Fi را غیرفعال کرده است. بسته به قابلیتهای سختافزار و سفتافزار، برخیاز دستگاهها ممکن است درصورت استفاده از SoftAP یا اینترنتبخشی، از Wi-Fi RTT پشتیبانی نکنند. برای بررسی
اینکه Wi-Fi RTT دردسترس است یا نه، isAvailable() را فراخوانی کنید.
دردسترس بودن Wi-Fi RTT ممکن است در هر زمانی تغییر کند. برنامه شما باید
BroadcastReceiver را برای دریافت ACTION_WIFI_RTT_STATE_CHANGED ثبت کند، که
هنگام تغییر دردسترس بودن ارسال میشود. وقتی برنامهتان هدف همهفرستی را دریافت میکند،
برنامه باید وضعیت فعلی دردسترس بودن را بررسی کند و رفتار خود را
براساس آن تنظیم کند.
برای مثال:
کاتلین
val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED)
val myReceiver = object: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (wifiRttManager.isAvailable) {
…
} else {
…
}
}
}
context.registerReceiver(myReceiver, filter)
جاوا
IntentFilter filter =
new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (wifiRttManager.isAvailable()) {
…
} else {
…
}
}
};
context.registerReceiver(myReceiver, filter);
برای اطلاعات بیشتر، به همهفرستیها مراجعه کنید.
ایجاد درخواست فاصلهیابی
درخواست فاصلهیابی (RangingRequest) با مشخص کردن فهرستی از APها یا
همتاهای Wi-Fi Aware که فاصله آنها درخواست شده است ایجاد میشود. چندین نقطه دسترسی یا همتای Wi-Fi Aware را میتوان در یک درخواست تعیین محدوده مشخص کرد؛ فاصلهها تا همه دستگاهها اندازهگیری و برگردانده میشود.
برای مثال، درخواست میتواند از روش addAccessPoint() برای مشخص کردن نقطه دسترسیای که فاصله تا آن اندازهگیری میشود استفاده کند:
کاتلین
val req: RangingRequest = RangingRequest.Builder().run {
addAccessPoint(ap1ScanResult)
addAccessPoint(ap2ScanResult)
build()
}
جاوا
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);
RangingRequest req = builder.build();
نقطه دسترسی با شیء ScanResult آن شناسایی میشود که میتوان آن را با فراخوانی WifiManager.getScanResults() بهدست آورد. میتوانید از
addAccessPoints(List<ScanResult>) برای افزودن چند نقطه دسترسی بهصورت دستهای استفاده کنید.
اشیاء ScanResult میتوانند هم IEEE 802.11mc (is80211mcResponder()) و هم
IEEE 802.11az غیرمبتنی بر راهانداز (is80211azNtbResponder()) را که APها پشتیبانی میکنند داشته باشند. دستگاههایی که از محدوده IEEE 802.11az NTB پشتیبانی میکنند، بسته به قابلیت نقطه دسترسی، محدوده 802.11mc یا 802.11az را اجرا میکنند و اگر نقطه دسترسی از هر دو پشتیبانی کند، بهطور پیشفرض 802.11az را اجرا میکنند. دستگاههایی که از IEEE 802.11az پشتیبانی نمیکنند، همه فاصلهیابیها را بااستفاده از پروتکل IEEE 802.11mc انجام میدهند.
بهطور مشابه، درخواست فاصلهیابی میتواند بااستفاده از نشانی MAC یا PeerHandle، بهترتیب بااستفاده از روشهای addWifiAwarePeer(MacAddress peer) و addWifiAwarePeer(PeerHandle peer)، یک همتای Wi-Fi Aware اضافه کند. برای کسب اطلاعات بیشتر درباره کشف همتاهای Wi-Fi Aware، به اسناد Wi-Fi Aware مراجعه کنید.
درخواست محدوده
برنامه بااستفاده از روش WifiRttManager.startRanging() و ارائه موارد زیر، درخواست فاصلهیابی صادر میکند: RangingRequest برای مشخص کردن عملیات، Executor برای مشخص کردن بافتار فراخوانی، و RangingResultCallback برای دریافت نتایج.
برای مثال:
کاتلین
val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager
val request: RangingRequest = myRequest
mgr.startRanging(request, executor, object : RangingResultCallback() {
override fun onRangingResults(results: List<RangingResult>) { … }
override fun onRangingFailure(code: Int) { … }
})
جاوا
WifiRttManager mgr =
(WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
RangingRequest request ...;
mgr.startRanging(request, executor, new RangingResultCallback() {
@Override
public void onRangingFailure(int code) { … }
@Override
public void onRangingResults(List<RangingResult> results) { … }
});
عملیات فاصلهیابی بهصورت ناهمگام انجام میشود و نتایج فاصلهیابی در یکی از فراخوانهای برگشتی RangingResultCallback برگردانده میشود:
- اگر کل عملیات فاصلهیابی ناموفق باشد، فراخوانی برگشتی
onRangingFailureبا رمز وضعیت شرحدادهشده درRangingResultCallbackراهاندازی میشود. چنین خطایی ممکن است زمانی رخ دهد که سرویس نتواند عملیات فاصلهیابی را در آن زمان اجرا کند—برای مثال، بهدلیل غیرفعال بودن Wi-Fi، بهدلیل اینکه برنامه درخواستهای زیادی برای عملیات فاصلهیابی ارسال کرده و محدود شده است، یا بهدلیل مشکل در مجوزها. - وقتی عملیات فاصلهیابی تکمیل میشود،
onRangingResultsفراخوانی برگشتی با فهرستی از نتایج که با فهرست درخواستها مطابقت دارد (یک نتیجه برای هر درخواست) راهاندازی میشود. ترتیب نتایج لزوماً با ترتیب درخواستها مطابقت ندارد. توجه داشته باشید که ممکن است عملیات فاصلهیابی تکمیل شود، اما هر نتیجه همچنان ممکن است نشاندهنده ناموفق بودن آن اندازهگیری خاص باشد.
تفسیر نتایج فاصلهیابی
هریک از نتایج برگرداندهشده توسط فراخوانی برگشتی onRangingResults با یک شیء RangingResult مشخص میشود. برای هر درخواست، موارد زیر را انجام دهید.
۱. شناسایی درخواست
درخواست را براساس اطلاعات ارائهشده هنگام ایجاد
RangingRequest شناسایی کنید، اغلب مک آدرسی که در ScanResult
ارائه شده است نقطه دسترسی را شناسایی میکند. مک آدرس را میتوان از نتیجه فاصلهیابی بااستفاده از روش getMacAddress() بهدست آورد.
فهرست نتایج فاصلهیابی ممکن است با ترتیب همتاها (نقاط دسترسی) مشخصشده در درخواست فاصلهیابی متفاوت باشد، بنابراین برای شناسایی همتا از نشانی MAC استفاده کنید، نه ترتیب نتایج.
۲. تعیین اینکه آیا هر اندازهگیری موفقیتآمیز بوده است یا نه
برای تعیین اینکه اندازهگیری موفقیتآمیز بوده است یا نه، از روش getStatus() استفاده کنید. هر مقداری غیراز STATUS_SUCCESS نشاندهنده شکست است. شکست
به این معنی است که همه فیلدهای دیگر این نتیجه (بهجز شناسایی درخواست
در مرحله قبلی) نامعتبر هستند و روش get* مربوطه
با استثنای IllegalStateException ناموفق میشود.
۳. دریافت نتایج برای هر اندازهگیری موفق
برای هر اندازهگیری موفق (RangingResult)، میتوانید مقادیر نتیجه را با روشهای مربوطه get بازیابی کنید:
فاصله، به میلیمتر، و انحراف معیار اندازهگیری:
نشانگر قدرت سیگنال دریافتی بستههای مورداستفاده برای اندازهگیریها:
زمان به میلیثانیه که اندازهگیری در آن انجام شده است (نشاندهنده زمان از زمان راهاندازی):
تعداد اندازهگیریهایی که انجام شده و تعداد اندازهگیریهایی که موفقیتآمیز بوده است (و اندازهگیریهای فاصله براساس آنها است):
حداقل و حداکثر زمانی که دستگاه مشتری باید بین اندازهگیریهای 11az NTB منتظر بماند:
getMinTimeBetweenNtbMeasurementsMicros()وgetMaxTimeBetweenNtbMeasurementsMicros()حداقل و حداکثر زمان را برمیگردانند. اگر اندازهگیری فاصلهیابی بعدی قبلاز سپری شدن حداقل زمان درخواست شود، میانای برنامهسازی کاربردی نتیجه فاصلهیابی ذخیرهشده در حافظه نهان را برمیگرداند. اگر اندازهگیری فاصلهیابی بعدی پساز سپری شدن حداکثر زمان درخواست شود، API جلسه فاصلهیابی غیرراهانداز را خاتمه میدهد و جلسه فاصلهیابی جدیدی را با ایستگاه پاسخدهنده مذاکره میکند. از درخواست جلسه فاصلهیابی جدید اجتناب کنید، زیرا این کار باعث افزایش سربار در زمان اندازهگیری فاصلهیابی میشود. برای بهرهمندی کامل از کارایی فاصلهیابی غیرمبتنی بر راهانداز 802.11az، درخواست فاصلهیابی بعدی را بین حداقل و حداکثر زمان اندازهگیری مشخصشده در اندازهگیریRangingResultقبلی راهاندازی کنید.تکرارهای «میدان آموزش طولانی» (LTF) که ایستگاههای پاسخدهنده و آغازگر در مقدمه برای نتیجه IEEE 802.11az NTB استفاده کردهاند:
تعداد جریانهای زمانی فضایی (STS) ارسال و دریافت که ایستگاه آغازگر برای نتیجه IEEE 802.11az NTB استفاده کرده است:
دستگاههای Android که از WiFi-RTT پشتیبانی میکنند
جدولهای زیر برخیاز تلفنها، نقطههای دسترسی، و دستگاههای خردهفروشی، انبارداری، و مرکز توزیع را که از WiFi-RTT پشتیبانی میکنند فهرست میکند. اینها اصلاً جامع نیستند. توصیه میکنیم با ما تماس بگیرید تا محصولات سازگار با «نوشتار همزمان» شما را در اینجا فهرست کنیم.
نقاط دسترسی
| سازنده و مدل | تاریخ پشتیبانی | پروتکل |
|---|---|---|
| Nest Wifi Pro (Wi-Fi 6E) | پشتیبانی میشود | mc |
| Compulab WILD AP | پشتیبانی میشود | mc |
| Google Wi-Fi | پشتیبانی میشود | mc |
| رهیاب Google Nest Wi-Fi | پشتیبانی میشود | mc |
| نقطه Google Nest Wi-Fi | پشتیبانی میشود | mc |
| Aruba AP-635 | پشتیبانی میشود | mc |
| Cisco 9130 | پشتیبانی میشود | mc |
| Cisco 9136 | پشتیبانی میشود | mc |
| Cisco 9166 | پشتیبانی میشود | mc |
| Cisco 9164 | پشتیبانی میشود | mc |
| Cisco CW9172I | پشتیبانی میشود | mc/az |
| Cisco CW9172H | پشتیبانی میشود | mc/az |
| Cisco CW9176I | پشتیبانی میشود | mc/az |
| Cisco CW9178I | پشتیبانی میشود | mc/az |
| Aruba AP-505 | پشتیبانی میشود | mc |
| Aruba AP-515 | پشتیبانی میشود | mc |
| Aruba AP-575 | پشتیبانی میشود | mc |
| Aruba AP-518 | پشتیبانی میشود | mc |
| Aruba AP-505H | پشتیبانی میشود | mc |
| Aruba AP-565 | پشتیبانی میشود | mc |
| Aruba AP-535 | پشتیبانی میشود | mc |
| Aruba AP567 | پشتیبانی میشود | mc |
| Aruba AP577 | پشتیبانی میشود | mc |
| Aruba AP555 | پشتیبانی میشود | mc |
| Aruba AP635 | پشتیبانی میشود | mc |
| Aruba AP655 | پشتیبانی میشود | mc |
| Aruba AP615 | پشتیبانی میشود | mc |
| Aruba AP734 | پشتیبانی میشود | mc/az |
| Aruba AP735 | پشتیبانی میشود | mc/az |
| Aruba AP754 | پشتیبانی میشود | mc/az |
| Aruba AP755 | پشتیبانی میشود | mc/az |
تلفنها
| سازنده و مدل | نسخه Android |
|---|---|
| Google Pixel 9 Pro XL | +14 |
| Google Pixel 9 | +14 |
| Google Pixel 9 Pro | +14 |
| Google Pixel 9 Pro XL | +14 |
| Google Pixel 7a | +14 |
| Google Pixel 7 | +14 |
| Google Pixel 8 | +14 |
| Google Pixel 8 Pro | +14 |
| Google Pixel 8a | +14 |
| Samsung SM-S918B | +14 |
| Samsung SM-A515F | +14 |
| Google Pixel 9 Pro | +14 |
| Samsung SM-A546E | +14 |
| Samsung SM-S928B | +14 |
| Samsung SM-A217F | +14 |
| Samsung SM-A715F | +14 |
| Samsung SM-A528B | +14 |
| Samsung SM-A135F | +14 |
| Samsung SM-S911B | +14 |
| Xiaomi 21091116AI | +14 |
| Google Pixel 9 | +14 |
| Samsung SM-A127F | +14 |
| Google Pixel 7 Pro | +14 |
| Samsung SM-A556E | +14 |
| Pixel 6 | ۹٫۰+ |
| Pixel 6 Pro | ۹.۰+ |
| Pixel 5 | ۹.۰+ |
| Pixel 5a | ۹٫۰+ |
| Pixel 5a 5G | ۹.۰+ |
| Xiaomi Mi 10 Pro | ۹٫۰+ |
| Xiaomi Mi 10 | ۹٫۰+ |
| Xiaomi Redmi Mi 9T Pro | ۹.۰+ |
| Xiaomi Mi 9T | ۹٫۰+ |
| Xiaomi Mi 9 | ۹٫۰+ |
| Xiaomi Mi Note 10 | ۹٫۰+ |
| Xiaomi Mi Note 10 Lite | ۹٫۰+ |
| Xiaomi Redmi Note 9S | ۹٫۰+ |
| Xiaomi Redmi Note 9 Pro | ۹٫۰+ |
| Xiaomi Redmi Note 8T | ۹٫۰+ |
| Xiaomi Redmi Note 8 | ۹٫۰+ |
| Xiaomi Redmi K30 Pro | ۹٫۰+ |
| Xiaomi Redmi K20 Pro | ۹٫۰+ |
| Xiaomi Redmi K20 | ۹٫۰+ |
| Xiaomi Redmi Note 5 Pro | ۹.۰+ |
| Xiaomi Mi CC9 Pro | ۹٫۰+ |
| LG G8X ThinQ | ۹٫۰+ |
| LG V50S ThinQ | ۹٫۰+ |
| LG V60 ThinQ | ۹٫۰+ |
| LG V30 | ۹٫۰+ |
| Samsung Galaxy Note 10+ 5G | ۹٫۰+ |
| Samsung Galaxy S20+ 5G | ۹٫۰+ |
| +Samsung Galaxy S20 | ۹٫۰+ |
| Samsung Galaxy S20 5G | ۹٫۰+ |
| Samsung Galaxy S20 Ultra 5G | ۹٫۰+ |
| Samsung Galaxy S20 | ۹٫۰+ |
| Samsung Galaxy Note 10+ | ۹.۰+ |
| Samsung Galaxy Note 10 5G | ۹.۰+ |
| Samsung Galaxy Note 10 | ۹٫۰+ |
| Samsung A9 Pro | ۹٫۰+ |
| Google Pixel 4 XL | ۹٫۰+ |
| Google Pixel 4 | ۹٫۰+ |
| Google Pixel 4a | ۹.۰+ |
| Google Pixel 3 XL | ۹٫۰+ |
| Google Pixel 3 | ۹٫۰+ |
| Google Pixel 3a XL | ۹٫۰+ |
| Google Pixel 3a | ۹.۰+ |
| Google Pixel 2 XL | ۹.۰+ |
| Google Pixel 2 | ۹٫۰+ |
| Google Pixel 1 XL | ۹٫۰+ |
| Google Pixel 1 | ۹٫۰+ |
| Poco X2 | ۹.۰+ |
| Sharp Aquos R3 SH-04L | ۹٫۰+ |
دستگاههای مرکز توزیع، انبارداری، و خردهفروشی
| سازنده و مدل | نسخه Android |
|---|---|
| Zebra PS20 | ۱۰٫۰+ |
| Zebra TC52/TC52HC | ۱۰٫۰+ |
| Zebra TC57 | ۱۰٫۰+ |
| Zebra TC72 | ۱۰٫۰+ |
| Zebra TC77 | ۱۰٫۰+ |
| Zebra MC93 | ۱۰٫۰+ |
| Zebra TC8300 | ۱۰٫۰+ |
| Zebra VC8300 | ۱۰٫۰+ |
| Zebra EC30 | ۱۰٫۰+ |
| Zebra ET51 | ۱۰٫۰+ |
| Zebra ET56 | ۱۰٫۰+ |
| Zebra L10 | ۱۰٫۰+ |
| Zebra CC600/CC6000 | ۱۰٫۰+ |
| Zebra MC3300x | ۱۰٫۰+ |
| Zebra MC330x | ۱۰٫۰+ |
| Zebra TC52x | ۱۰٫۰+ |
| Zebra TC57x | ۱۰٫۰+ |
| Zebra EC50 (LAN و HC) | ۱۰٫۰+ |
| Zebra EC55 (WAN) | ۱۰٫۰+ |
| Zebra WT6300 | ۱۰٫۰+ |
| Skorpio X5 | ۱۰٫۰+ |