คุณสามารถใช้ฟังก์ชันตำแหน่ง Wi-Fi ที่ได้จาก Wi-Fi RTT (Round-Trip-Time) API เพื่อวัดระยะทางไปยังจุดเข้าใช้งาน Wi-Fi ที่รองรับ RTT และอุปกรณ์ Wi-Fi Aware ที่อยู่ใกล้เคียง
หากวัดระยะทางไปยังจุดเข้าใช้งาน 3 จุดขึ้นไป คุณสามารถใช้อัลกอริทึม Multilateration เพื่อประมาณตำแหน่งของอุปกรณ์ที่สอดคล้องกับการวัดเหล่านั้นมากที่สุด โดยปกติแล้ว ผลลัพธ์จะมีความแม่นยำภายในระยะ 1-2 เมตร
ความแม่นยำนี้ช่วยให้คุณพัฒนาบริการตามตำแหน่งที่ละเอียดได้ เช่น การนำทางในอาคาร การควบคุมด้วยเสียงที่ชัดเจน (เช่น "เปิดไฟดวงนี้") และข้อมูลตามตำแหน่ง (เช่น "มีข้อเสนอพิเศษสำหรับผลิตภัณฑ์นี้ไหม")
อุปกรณ์ที่ส่งคำขอไม่จำเป็นต้องเชื่อมต่อกับจุดเข้าใช้งานเพื่อวัดระยะทางด้วย Wi-Fi RTT เพื่อรักษาความเป็นส่วนตัว มีเพียงอุปกรณ์ที่ส่งคำขอเท่านั้นที่สามารถระบุระยะห่างจากจุดเข้าใช้งานได้ โดยจุดเข้าใช้งานจะไม่มีข้อมูลนี้ การดำเนินการ Wi-Fi RTT ไม่จำกัดสำหรับแอปที่ทำงานอยู่เบื้องหน้า แต่จะถูกจำกัดสำหรับแอปที่ทำงานอยู่เบื้องหลัง
ความสามารถของ Wi-Fi RTT และ Fine-Time-Measurement (FTM) ที่เกี่ยวข้องเป็นไปตามมาตรฐาน IEEE 802.11-2016 Wi-Fi RTT ต้องใช้การวัดเวลาที่แม่นยำจาก FTM เนื่องจากจะคำนวณระยะห่างระหว่างอุปกรณ์ 2 เครื่องโดยวัดเวลาที่แพ็กเก็ตใช้ในการเดินทางไปกลับระหว่างอุปกรณ์ แล้วคูณเวลานั้นด้วยความเร็วแสง
Android 15 (ระดับ API 35) เปิดตัวการรองรับการกำหนดช่วงแบบไม่ใช้ทริกเกอร์ (NTB) ของ IEEE 802.11az
ความแตกต่างในการติดตั้งใช้งานตามเวอร์ชัน Android
Wi-Fi RTT เปิดตัวใน Android 9 (ระดับ API 28) เมื่อใช้โปรโตคอลนี้เพื่อระบุตำแหน่งของอุปกรณ์โดยใช้การระบุตำแหน่งแบบหลายจุด (Multilateration) กับอุปกรณ์ที่ใช้ Android 9 คุณต้องมีสิทธิ์เข้าถึงข้อมูลตำแหน่งของจุดเข้าใช้งาน (AP) ที่กำหนดไว้ล่วงหน้าในแอป คุณเป็นผู้ตัดสินใจว่าจะจัดเก็บและดึงข้อมูลนี้อย่างไร
ในอุปกรณ์ที่ใช้ Android 10 (API ระดับ 29) ขึ้นไป ข้อมูลตำแหน่งของ AP จะแสดงเป็นออบเจ็กต์ ResponderLocation ซึ่งรวมถึงละติจูด ลองจิจูด และระดับความสูง สำหรับ Wi-Fi RTT AP ที่รองรับข้อมูลการกำหนดค่าตำแหน่ง/รายงานตำแหน่งทางแพ่ง (ข้อมูล LCI/LCR) โปรโตคอลจะแสดงผลออบเจ็กต์ ResponderLocation ในระหว่างกระบวนการกำหนดช่วง
ฟีเจอร์นี้ช่วยให้แอปค้นหา AP เพื่อขอตำแหน่งได้โดยตรงแทนที่จะต้องจัดเก็บข้อมูลนี้ไว้ล่วงหน้า ดังนั้นแอปของคุณจึงสามารถค้นหา AP และระบุตำแหน่งได้แม้ว่าจะไม่รู้จัก AP มาก่อน เช่น เมื่อผู้ใช้เข้าสู่อาคารใหม่
การรองรับการวัดระยะ NTB ของ IEEE 802.11az พร้อมใช้งานในอุปกรณ์ที่ใช้ Android 15 (ระดับ API 35) ขึ้นไป ซึ่งหมายความว่าหากอุปกรณ์รองรับโหมดตัวเริ่มต้น NTB ของ IEEE 802.11az (ระบุโดย WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_NTB_INITIATOR) แอปของคุณจะค้นหา AP ที่รองรับทั้ง IEEE 802.11mc และ IEEE 802.11az ได้ด้วยคำขอช่วงเดียว API RangingResult ได้รับการขยายเพื่อแสดงข้อมูลเกี่ยวกับค่าต่ำสุดและสูงสุดที่สามารถใช้สำหรับช่วงเวลาระหว่างการวัดระยะ โดยปล่อยให้ช่วงเวลาที่แน่นอนอยู่ในการควบคุมของแอป
ข้อกำหนด
- ฮาร์ดแวร์ของอุปกรณ์ที่ส่งคำขอการกำหนดช่วงต้องใช้มาตรฐาน FTM 802.11-2016 หรือมาตรฐาน 802.11az (การกำหนดช่วงที่ไม่ได้อิงตามทริกเกอร์)
- อุปกรณ์ที่ส่งคำขอการกำหนดระยะต้องใช้ Android 9 (ระดับ API 28) ขึ้นไป การวัดระยะแบบไม่ใช้ทริกเกอร์ IEEE 802.11az จะเปิดใช้ในอุปกรณ์ที่ใช้ Android 15 (ระดับ API 35) ขึ้นไป
- อุปกรณ์ที่ส่งคำขอการวัดระยะต้องเปิดใช้บริการตำแหน่งและการสแกน Wi-Fi (ในส่วนการตั้งค่า > ตำแหน่ง)
- หากแอปที่ส่งคำขอการกำหนดช่วงกำหนดเป้าหมายเป็น Android 13 (ระดับ API 33) ขึ้นไป แอปต้องมีสิทธิ์
NEARBY_WIFI_DEVICESหากแอปดังกล่าวกำหนดเป้าหมายเป็น Android เวอร์ชันก่อนหน้า แอปจะต้องมีสิทธิ์ACCESS_FINE_LOCATIONแทน - แอปต้องค้นหาช่วงของจุดเข้าใช้งานขณะที่แอปแสดงอยู่หรืออยู่ในบริการที่ทำงานอยู่เบื้องหน้า แอปไม่สามารถเข้าถึงข้อมูลตำแหน่งจากเบื้องหลัง
- จุดเข้าใช้งานต้องใช้มาตรฐาน IEEE 802.11-2016 FTM หรือมาตรฐาน IEEE 802.11az (การกำหนดช่วงโดยไม่ใช้ทริกเกอร์)
ตั้งค่า
หากต้องการตั้งค่าแอปให้ใช้ Wi-Fi RTT ให้ทำตามขั้นตอนต่อไปนี้
1. ขอสิทธิ์
ขอสิทธิ์ต่อไปนี้ในไฟล์ Manifest ของแอป
<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 แอปของคุณจะต้องขอสิทธิ์จากผู้ใช้หากยังไม่ได้รับสิทธิ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์รันไทม์ได้ที่ขอสิทธิ์ของแอป
2. ตรวจสอบว่าอุปกรณ์รองรับ Wi-Fi RTT หรือไม่
หากต้องการตรวจสอบว่าอุปกรณ์รองรับ Wi-Fi RTT หรือไม่ ให้ใช้ API PackageManager ดังนี้
Kotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)
Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
3. ตรวจสอบว่า Wi-Fi RTT พร้อมใช้งานหรือไม่
Wi-Fi RTT อาจมีอยู่ในอุปกรณ์ แต่อาจใช้งานไม่ได้เนื่องจากผู้ใช้ปิดใช้ Wi-Fi อุปกรณ์บางเครื่องอาจไม่รองรับ Wi-Fi RTT หากมีการใช้ SoftAP หรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ ทั้งนี้ขึ้นอยู่กับความสามารถของฮาร์ดแวร์และเฟิร์มแวร์ หากต้องการตรวจสอบว่า Wi-Fi RTT พร้อมใช้งานหรือไม่ ให้เรียกใช้ isAvailable()
ความพร้อมใช้งานของ Wi-Fi RTT อาจเปลี่ยนแปลงได้ทุกเมื่อ แอปของคุณควรลงทะเบียน
BroadcastReceiver
เพื่อรับ
ACTION_WIFI_RTT_STATE_CHANGED
ซึ่งจะส่งเมื่อความพร้อมใช้งานมีการเปลี่ยนแปลง เมื่อแอปได้รับ Intent การออกอากาศ แอปควรตรวจสอบสถานะความพร้อมใช้งานปัจจุบันและปรับลักษณะการทำงานตามความเหมาะสม
เช่น
Kotlin
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)
Java
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() เพื่อระบุจุดเข้าใช้งานที่จะวัดระยะทางได้ ดังนี้
Kotlin
val req: RangingRequest = RangingRequest.Builder().run { addAccessPoint(ap1ScanResult) addAccessPoint(ap2ScanResult) build() }
Java
RangingRequest.Builder builder = new RangingRequest.Builder(); builder.addAccessPoint(ap1ScanResult); builder.addAccessPoint(ap2ScanResult); RangingRequest req = builder.build();
จุดเข้าใช้งานจะระบุด้วยออบเจ็กต์ ScanResult ซึ่งรับได้โดยการเรียกใช้ WifiManager.getScanResults()
คุณสามารถใช้
addAccessPoints(List<ScanResult>)
เพื่อเพิ่มจุดเข้าใช้งานหลายจุดในกลุ่มได้
ออบเจ็กต์ ScanResult สามารถมีทั้ง AP ที่รองรับ IEEE 802.11mc (is80211mcResponder()) และการกำหนดช่วงที่ไม่ได้อิงตามทริกเกอร์ IEEE 802.11az (is80211azNtbResponder()) อุปกรณ์ที่รองรับการกำหนดช่วง NTB ของ IEEE 802.11az จะทำการกำหนดช่วง 802.11mc หรือ 802.11az โดยขึ้นอยู่กับความสามารถของ AP และจะใช้ 802.11az เป็นค่าเริ่มต้นเมื่อ AP รองรับทั้ง 2 แบบ อุปกรณ์ที่ไม่รองรับ IEEE 802.11az จะทำการวัดระยะทั้งหมดโดยใช้โปรโตคอล IEEE 802.11mc
ในทำนองเดียวกัน คำขอการกำหนดช่วงสามารถเพิ่มเพียร์ Wi-Fi Aware โดยใช้ที่อยู่ MAC หรือ PeerHandle โดยใช้เมธอด addWifiAwarePeer(MacAddress peer) และ addWifiAwarePeer(PeerHandle peer) ตามลำดับ ดูข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาแอปเทียบเท่าที่ใช้ Wi-Fi Aware ได้ที่เอกสารประกอบเกี่ยวกับ Wi-Fi Aware
ขอให้จัดอันดับ
แอปจะส่งคำขอการวัดระยะโดยใช้เมธอด WifiRttManager.startRanging() และระบุข้อมูลต่อไปนี้ RangingRequest เพื่อระบุการดำเนินการ Executor เพื่อระบุบริบท Callback และ RangingResultCallback เพื่อรับผลลัพธ์
เช่น
Kotlin
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) { … } })
Java
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) { … } });
การดำเนินการวัดระยะจะดำเนินการแบบไม่พร้อมกัน และระบบจะแสดงผลลัพธ์การวัดระยะใน Callback รายการใดรายการหนึ่งของ RangingResultCallback ดังนี้
- หากการดำเนินการกำหนดช่วงทั้งหมดไม่สำเร็จ ระบบจะเรียกใช้ Callback
onRangingFailureพร้อมรหัสสถานะที่อธิบายไว้ในRangingResultCallbackความล้มเหลวดังกล่าวอาจเกิดขึ้นหากบริการไม่สามารถดำเนินการกำหนดช่วงได้ในขณะนั้น เช่น เนื่องจาก Wi-Fi ถูกปิดใช้ เนื่องจากแอปพลิเคชันขอการดำเนินการกำหนดช่วงมากเกินไปและถูกจำกัด หรือเนื่องจากปัญหาด้านสิทธิ์ - เมื่อการดำเนินการกำหนดระยะเสร็จสมบูรณ์ ระบบจะเรียกใช้ Callback
onRangingResultsพร้อมรายการผลลัพธ์ที่ตรงกับรายการคำขอ โดยมีผลลัพธ์ 1 รายการสำหรับคำขอแต่ละรายการ ลำดับของผลลัพธ์ไม่จำเป็นต้องตรงกับลำดับของคำขอ โปรดทราบว่าการดำเนินการวัดระยะอาจเสร็จสมบูรณ์ แต่ผลลัพธ์แต่ละรายการอาจยังคงระบุว่าการวัดนั้นๆ ไม่สำเร็จ
ตีความผลลัพธ์การวัดระยะ
ผลลัพธ์แต่ละรายการที่ได้จากคอลแบ็ก onRangingResults จะระบุโดยออบเจ็กต์ RangingResult ในคำขอแต่ละรายการ ให้ทำดังนี้
1. ระบุคำขอ
ระบุคำขอตามข้อมูลที่ให้ไว้เมื่อสร้าง RangingRequest: ส่วนใหญ่จะเป็นที่อยู่ MAC ที่ระบุไว้ใน ScanResult ซึ่งระบุจุดเข้าใช้งาน คุณสามารถรับที่อยู่ MAC จากผลลัพธ์การกำหนดช่วงได้โดยใช้เมธอด getMacAddress()
รายการผลลัพธ์การกำหนดช่วงอาจมีลำดับแตกต่างจากเพียร์ (จุดเข้าใช้งาน) ที่ระบุไว้ในคำขอการกำหนดช่วง ดังนั้นคุณควรใช้ที่อยู่ MAC เพื่อระบุเพียร์ ไม่ใช่ลำดับของผลลัพธ์
2. พิจารณาว่าการวัดแต่ละครั้งประสบความสำเร็จหรือไม่
หากต้องการตรวจสอบว่าการวัดผลสำเร็จหรือไม่ ให้ใช้เมธอด getStatus() ค่าอื่นๆ นอกเหนือจาก
STATUS_SUCCESS
จะบ่งบอกถึงความล้มเหลว ความล้มเหลวหมายความว่าฟิลด์อื่นๆ ทั้งหมดของผลลัพธ์นี้ (ยกเว้นการระบุคำขอด้านบน) ไม่ถูกต้อง และเมธอด get* ที่เกี่ยวข้องจะดำเนินการไม่สำเร็จพร้อมข้อยกเว้น IllegalStateException
3. ดูผลลัพธ์สำหรับการวัดผลที่สำเร็จแต่ละรายการ
สำหรับการวัดผลที่สำเร็จแต่ละครั้ง (RangingResult) คุณสามารถดึงค่าผลลัพธ์ด้วยเมธอด get ที่เกี่ยวข้องได้ดังนี้
ระยะทาง (หน่วยเป็นมิลลิเมตร) และค่าเบี่ยงเบนมาตรฐานของการวัด
RSSI ของแพ็กเก็ตที่ใช้สำหรับการวัด:
เวลาในหน่วยมิลลิวินาทีที่ทำการวัด (ระบุเวลาตั้งแต่เปิดเครื่อง)
จำนวนการวัดที่พยายามทำและจำนวนการวัดที่สำเร็จ (และเป็นพื้นฐานของการวัดระยะทาง)
เวลาขั้นต่ำและสูงสุดที่อุปกรณ์ไคลเอ็นต์ต้องรอระหว่างการวัด NTB 11az
getMinTimeBetweenNtbMeasurementsMicros()และgetMaxTimeBetweenNtbMeasurementsMicros()จะแสดงเวลาต่ำสุดและสูงสุด หากมีการขอการวัดระยะครั้งถัดไปก่อนที่เวลาขั้นต่ำจะผ่านไป API จะแสดงผลลัพธ์การวัดระยะที่แคชไว้ หากมีการขอการวัดระยะครั้งถัดไปหลังจากเวลาสูงสุดผ่านไปแล้ว API จะสิ้นสุดเซสชันการวัดระยะที่ไม่ใช่ทริกเกอร์และเจรจาเซสชันการวัดระยะใหม่กับสถานีที่ตอบสนอง คุณควรหลีกเลี่ยงการขอเซสชันการวัดระยะใหม่ เนื่องจากจะเพิ่มค่าใช้จ่ายในการประมวลผลให้กับเวลาในการวัดระยะ หากต้องการใช้ประโยชน์จากประสิทธิภาพการกำหนดช่วงที่ไม่ได้อิงตามทริกเกอร์ของ 802.11az อย่างเต็มที่ ให้ทริกเกอร์คำขอการกำหนดช่วงถัดไประหว่างเวลาการวัดขั้นต่ำและสูงสุดที่ระบุไว้ในการวัดRangingResultก่อนหน้าการทำซ้ำ Long Training Field (LTF) ที่สถานีผู้ตอบและผู้เริ่มใช้ในข้อความนำสำหรับผลลัพธ์ IEEE 802.11az NTB
จำนวนสตรีมเชิงพื้นที่ (STS) ที่ส่งและรับซึ่งสถานีผู้เริ่มต้นใช้สำหรับผลลัพธ์ IEEE 802.11az NTB
อุปกรณ์ Android ที่รองรับ WiFi-RTT
ตารางต่อไปนี้แสดงโทรศัพท์ จุดเข้าใช้งาน และอุปกรณ์สำหรับร้านค้าปลีก คลังสินค้า และศูนย์กระจายสินค้าบางรุ่นที่รองรับ WiFi-RTT ซึ่งยังไม่ครอบคลุมทั้งหมด เราขอแนะนำให้คุณติดต่อเราเพื่อแสดงผลิตภัณฑ์ที่รองรับ RTT ที่นี่
จุดเข้าใช้งาน
| ผู้ผลิตและรุ่น | วันที่สนับสนุน | โปรโตคอล |
|---|---|---|
| Nest Wifi Pro (Wi-Fi 6E) | รองรับ | mc |
| Compulab WILD AP | รองรับ | mc |
| Google Wi-Fi | รองรับ | mc |
| เราเตอร์ Google Nest Wifi | รองรับ | mc |
| Google Nest Wifi Point | รองรับ | 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 | 9.0 ขึ้นไป |
| Pixel 6 Pro | 9.0 ขึ้นไป |
| Pixel 5 | 9.0 ขึ้นไป |
| Pixel 5a | 9.0 ขึ้นไป |
| Pixel 5a 5G | 9.0 ขึ้นไป |
| Xiaomi Mi 10 Pro | 9.0 ขึ้นไป |
| Xiaomi Mi 10 | 9.0 ขึ้นไป |
| Xiaomi Redmi Mi 9T Pro | 9.0 ขึ้นไป |
| Xiaomi Mi 9T | 9.0 ขึ้นไป |
| Xiaomi Mi 9 | 9.0 ขึ้นไป |
| Xiaomi Mi Note 10 | 9.0 ขึ้นไป |
| Xiaomi Mi Note 10 Lite | 9.0 ขึ้นไป |
| Xiaomi Redmi Note 9S | 9.0 ขึ้นไป |
| Xiaomi Redmi Note 9 Pro | 9.0 ขึ้นไป |
| Xiaomi Redmi Note 8T | 9.0 ขึ้นไป |
| Xiaomi Redmi Note 8 | 9.0 ขึ้นไป |
| Xiaomi Redmi K30 Pro | 9.0 ขึ้นไป |
| Xiaomi Redmi K20 Pro | 9.0 ขึ้นไป |
| Xiaomi Redmi K20 | 9.0 ขึ้นไป |
| Xiaomi Redmi Note 5 Pro | 9.0 ขึ้นไป |
| Xiaomi Mi CC9 Pro | 9.0 ขึ้นไป |
| LG G8X ThinQ | 9.0 ขึ้นไป |
| LG V50S ThinQ | 9.0 ขึ้นไป |
| LG V60 ThinQ | 9.0 ขึ้นไป |
| LG V30 | 9.0 ขึ้นไป |
| Samsung Galaxy Note 10+ 5G | 9.0 ขึ้นไป |
| Samsung Galaxy S20+ 5G | 9.0 ขึ้นไป |
| Samsung Galaxy S20+ | 9.0 ขึ้นไป |
| Samsung Galaxy S20 5G | 9.0 ขึ้นไป |
| Samsung Galaxy S20 Ultra 5G | 9.0 ขึ้นไป |
| Samsung Galaxy S20 | 9.0 ขึ้นไป |
| Samsung Galaxy Note 10+ | 9.0 ขึ้นไป |
| Samsung Galaxy Note 10 5G | 9.0 ขึ้นไป |
| Samsung Galaxy Note 10 | 9.0 ขึ้นไป |
| Samsung A9 Pro | 9.0 ขึ้นไป |
| Google Pixel 4 XL | 9.0 ขึ้นไป |
| Google Pixel 4 | 9.0 ขึ้นไป |
| Google Pixel 4a | 9.0 ขึ้นไป |
| Google Pixel 3 XL | 9.0 ขึ้นไป |
| Google Pixel 3 | 9.0 ขึ้นไป |
| Google Pixel 3a XL | 9.0 ขึ้นไป |
| Google Pixel 3a | 9.0 ขึ้นไป |
| Google Pixel 2 XL | 9.0 ขึ้นไป |
| Google Pixel 2 | 9.0 ขึ้นไป |
| Google Pixel 1 XL | 9.0 ขึ้นไป |
| Google Pixel 1 | 9.0 ขึ้นไป |
| Poco X2 | 9.0 ขึ้นไป |
| Sharp Aquos R3 SH-04L | 9.0 ขึ้นไป |
อุปกรณ์สำหรับค้าปลีก คลังสินค้า และศูนย์กระจายสินค้า
| ผู้ผลิตและรุ่น | เวอร์ชัน Android |
|---|---|
| Zebra PS20 | 10.0 ขึ้นไป |
| Zebra TC52/TC52HC | 10.0 ขึ้นไป |
| Zebra TC57 | 10.0 ขึ้นไป |
| Zebra TC72 | 10.0 ขึ้นไป |
| Zebra TC77 | 10.0 ขึ้นไป |
| Zebra MC93 | 10.0 ขึ้นไป |
| Zebra TC8300 | 10.0 ขึ้นไป |
| Zebra VC8300 | 10.0 ขึ้นไป |
| Zebra EC30 | 10.0 ขึ้นไป |
| Zebra ET51 | 10.0 ขึ้นไป |
| Zebra ET56 | 10.0 ขึ้นไป |
| Zebra L10 | 10.0 ขึ้นไป |
| Zebra CC600/CC6000 | 10.0 ขึ้นไป |
| Zebra MC3300x | 10.0 ขึ้นไป |
| Zebra MC330x | 10.0 ขึ้นไป |
| Zebra TC52x | 10.0 ขึ้นไป |
| Zebra TC57x | 10.0 ขึ้นไป |
| Zebra EC50 (LAN และ HC) | 10.0 ขึ้นไป |
| Zebra EC55 (WAN) | 10.0 ขึ้นไป |
| Zebra WT6300 | 10.0 ขึ้นไป |
| Skorpio X5 | 10.0 ขึ้นไป |