Connectivity Manager เป็นบริการระบบ Android ที่ให้ข้อมูลเกี่ยวกับสถานะการเชื่อมต่อเครือข่ายของอุปกรณ์แก่แอปพลิเคชัน ช่วยให้สามารถตรวจสอบความพร้อมใช้งานของอินเทอร์เน็ต กำหนดประเภทเครือข่าย (Wi-Fi, ข้อมูลมือถือ, Ethernet) ติดตามการเปลี่ยนแปลงการเชื่อมต่อ และจัดการคำขอเครือข่ายตามคุณภาพการเชื่อมต่อ ตาม Android Developers, 2025, ConnectivityManager เป็น API หลักสำหรับการตรวจสอบเครือข่ายและเป็นส่วนหนึ่งของ Android Framework ตั้งแต่ API Level 1
ข้อสำคัญ
ConnectivityManager เป็นบริการระบบของระบบปฏิบัติการ Android ที่สามารถเข้าถึงได้ผ่าน Context.getSystemService(Context.CONNECTIVITY_SERVICE) โดยมี API สำหรับรับข้อมูลเกี่ยวกับการเชื่อมต่อเครือข่ายของอุปกรณ์ ตรวจสอบการเปลี่ยนแปลงเครือข่าย และจัดการคำขอเครือข่ายของแอปพลิเคชัน Connectivity Manager เป็นส่วนหนึ่งของ Android Framework ตั้งแต่เวอร์ชันแรกของแพลตฟอร์ม (API Level 1) และผ่านการเปลี่ยนแปลงที่สำคัญตลอดหลายทศวรรษ: จาก getActiveNetworkInfo() แบบง่ายไปจนถึงโมเดลรีแอกทีฟสมัยใหม่ด้วย NetworkCallback และ NetworkRequest
ความสามารถหลักของ Connectivity Manager ได้แก่: ตรวจสอบการมีอยู่ของการเชื่อมต่อเครือข่ายที่ใช้งานอยู่ กำหนดประเภทเครือข่าย (Wi-Fi, ข้อมูลมือถือ, Ethernet, Bluetooth, VPN) ตรวจสอบการเปลี่ยนแปลงสถานะเครือข่ายแบบเรียลไทม์ รับข้อมูลเกี่ยวกับแบนด์วิดท์และความหน่วง และจัดการคำขอเครือข่ายของแอปพลิเคชัน ConnectivityManager ใช้ร่วมกับ WorkManager และ Repository เพื่อนำสถาปัตยกรรม Offline-First การโหลดเนื้อหาแบบปรับตัว และการเพิ่มประสิทธิภาพของแอปพลิเคชันตามคุณภาพการเชื่อมต่อ
ตั้งแต่ Android 10 (API 29) Google เปลี่ยนแนวทางการทำงานกับ ConnectivityManager เมธอด getActiveNetworkInfo() ถูกประกาศว่าเลิกใช้ และแนะนำให้ใช้ registerDefaultNetworkCallback() หรือ registerNetworkCallback() กับ NetworkRequest แทน API ใหม่ให้ข้อมูลเครือข่ายที่ละเอียดมากขึ้น รวมถึงความสามารถในการตรวจจับแคปทีฟพอร์ทัล (Wi-Fi ที่ต้องยืนยันตัวตน) และประเมินคุณภาพการเชื่อมต่อ ConnectivityManager ยังรวมเข้ากับตระกูล Jetpack: ไลบรารี ConnectivityManager เปิดตัวในปี 2024 โดยเป็นส่วนหนึ่งของ Jetpack เพื่อทำให้การตรวจสอบเครือข่ายในแอป Compose ง่ายขึ้น
ในสถาปัตยกรรม Android สมัยใหม่ Connectivity Manager ถูกใช้ในระดับ Repository หรือ UseCase เพื่อตัดสินใจเกี่ยวกับคำขอเครือข่าย เลเยอร์ Repository ตรวจสอบสถานะเครือข่ายก่อนเรียก API: หากเครือข่ายไม่พร้อมใช้งาน ข้อมูลจะถูกส่งกลับจากที่จัดเก็บในเครื่อง (Room) หากเครือข่ายพร้อมใช้งาน จะทำคำขอไปยังเซิร์ฟเวอร์และบันทึกผลลัพธ์ใน Room ViewModel สมัครรับ Flow จาก Room และไม่ทราบรายละเอียดของการโต้ตอบเครือข่าย — ซึ่งช่วยให้สามารถทดสอบแต่ละเลเยอร์ได้อย่างอิสระ
Connectivity Manager รับข้อมูลสถานะเครือข่ายจากบริการระบบ connectivity ซึ่งโต้ตอบกับอินเทอร์เฟซเครือข่ายของเคอร์เนล Linux เมื่ออุปกรณ์เชื่อมต่อกับ Wi-Fi หรือเปิดข้อมูลมือถือ เคอร์เนลจะแจ้งบริการระบบ ซึ่งอัปเดตสถานะภายในและแจ้ง callback ที่ลงทะเบียนทั้งหมด สถาปัตยกรรมของ ConnectivityManager สร้างขึ้นบน Observer pattern: แอปพลิเคชันลงทะเบียน NetworkCallback และรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงเครือข่ายใดๆ — การสร้างการเชื่อมต่อ การสูญเสียการเชื่อมต่อ การเปลี่ยนประเภทเครือข่าย หรือการเสื่อมคุณภาพ
API สมัยใหม่ของ ConnectivityManager ใช้ NetworkRequest เพื่อกรองเหตุการณ์เครือข่าย NetworkRequest ช่วยให้สามารถระบุข้อกำหนดสำหรับเครือข่าย: ช่องสัญญาณ (Transport.WIFI, Transport.CELLULAR, Transport.ETHERNET) ความสามารถในการเชื่อมต่ออินเทอร์เน็ต (NetworkCapabilities.NET_CAPABILITY_INTERNET) และเกณฑ์อื่นๆ หากแอปพลิเคชันต้องการเฉพาะ Wi-Fi สำหรับดาวน์โหลดไฟล์ขนาดใหญ่ จะสร้าง NetworkRequest ด้วย Transport.WIFI และลงทะเบียน callback ระบบจะแจ้งเตือนแอปพลิเคชันเฉพาะเมื่อการเชื่อมต่อ Wi-Fi เปลี่ยนแปลง โดยละเว้นเหตุการณ์ของเครือข่ายมือถือ
คุณสมบัติที่สำคัญของ Connectivity Manager บน Android 12+ คือ เครือข่ายตามความสามารถ แอปพลิเคชันไม่เพียงแค่ตรวจสอบ "มีอินเทอร์เน็ตหรือไม่" แต่สามารถประเมินได้ว่ามีทราฟฟิกประเภทใดบ้าง ตัวอย่างเช่น NET_CAPABILITY_NOT_METERED ระบุการเชื่อมต่อแบบไม่จำกัด (Wi-Fi) NET_CAPABILITY_NOT_ROAMING ระบุว่าอุปกรณ์ไม่ได้อยู่ในโรมมิ่ง ซึ่งช่วยให้ตัดสินใจได้: ดาวน์โหลดวิดีโอผ่าน Wi-Fi เท่านั้น เลื่อนการซิงค์โครไนซ์ในโรมมิ่ง หรือใช้ข้อมูลมือถือเฉพาะคำขอที่สำคัญ
| API Level | เมธอดที่แนะนำ | สถานะ |
|---|---|---|
| 1-22 | getActiveNetworkInfo() | เลิกใช้ |
| 21+ | NetworkCallback + registerNetworkCallback() | แนะนำ |
| 24+ | registerDefaultNetworkCallback() | แนะนำ |
| 28+ | getActiveNetwork() + NetworkCapabilities | ทางเลือก |
| 31+ | registerBestMatchingNetworkCallback() | API ใหม่ |
การใช้ Connectivity Manager ในแอปพลิเคชัน Android ต้องมีสิทธิ์ ACCESS_NETWORK_STATE เป็นสิทธิ์บังคับสำหรับการอ่านข้อมูลเครือข่าย ซึ่งประกาศใน AndroidManifest.xml หากไม่มีสิทธิ์นี้ ConnectivityManager จะคืนค่า null สำหรับ getActiveNetwork() และจะไม่เรียก callback สำหรับการดำเนินการเครือข่าย จำเป็นต้องมีสิทธิ์ INTERNET ด้วย ตั้งแต่ Android 10 (API 29) แอปพลิเคชันสามารถตรวจสอบสถานะเครือข่ายได้โดยไม่ต้องขอสิทธิ์เพิ่มเติมขณะทำงาน — ACCESS_NETWORK_STATE เป็นสิทธิ์ปกติและจะได้รับโดยอัตโนมัติเมื่อติดตั้งแอปพลิเคชัน
Connectivity Manager สมัยใหม่มีเมธอดสำคัญหลายอย่างสำหรับทำงานกับเครือข่าย getActiveNetwork() (API 23+) คืน Network object ของเครือข่ายที่ใช้งานอยู่ปัจจุบัน หรือ null หากอุปกรณ์ไม่ได้เชื่อมต่อ เมธอดนี้ไม่ต้องการ callback และเหมาะสำหรับการตรวจสอบครั้งเดียว Network object สามารถส่งต่อไปยัง NetworkCapabilities เพื่อรับข้อมูลโดยละเอียด: ประเภทช่องสัญญาณ, สถานะการคิดเงิน (metered), โรมมิ่ง, ความสามารถในการเชื่อมต่ออินเทอร์เน็ต และคุณลักษณะอื่นๆ
registerDefaultNetworkCallback() (API 24+) เป็นวิธีที่ต้องการในการตรวจสอบเครือข่าย แอปพลิเคชันลงทะเบียน callback ที่จะถูกเรียกเมื่อมีการเปลี่ยนแปลงใดๆ ในเครือข่ายเริ่มต้น (เครือข่ายที่แอปพลิเคชันส่งทราฟฟิกผ่าน) Callback จะได้รับ Network object ที่สามารถใช้เพื่อผูก socket และ HTTP client เมธอดนี้แทนที่ getActiveNetworkInfo() ที่เลิกใช้แล้วและให้การตรวจสอบเครือข่ายแบบรีแอกทีฟโดยไม่ต้อง polling
registerNetworkCallback() (API 21+) ช่วยให้สมัครรับการเปลี่ยนแปลงของเครือข่ายประเภทเฉพาะผ่าน NetworkRequest ตัวอย่างเช่น แอปพลิเคชันสามารถติดตามเฉพาะเครือข่าย Wi-Fi โดยใช้ new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() ระบบจะแจ้งเตือนแอปพลิเคชันเกี่ยวกับการเชื่อมต่อ/ตัดการเชื่อมต่อ Wi-Fi โดยไม่ส่งผลกระทบต่อเหตุการณ์ของเครือข่ายมือถือ NetworkCapabilities.getLinkDownstreamBandwidthKbps() คืนค่าประมาณแบนด์วิดท์ขาลงในหน่วย kbit/s ซึ่งช่วยให้ปรับคุณภาพเนื้อหาตามความเร็วของการเชื่อมต่อ
| เมธอด | API ขั้นต่ำ | วัตถุประสงค์ |
|---|---|---|
| getActiveNetwork() | 23 | รับเครือข่ายที่ใช้งานอยู่ปัจจุบัน |
| getNetworkCapabilities() | 21 | รับความสามารถของเครือข่าย (ประเภท การคิดเงิน โรมมิ่ง) |
| registerDefaultNetworkCallback() | 24 | ตรวจสอบเครือข่ายเริ่มต้น |
| registerNetworkCallback() | 21 | ตรวจสอบเครือข่ายตามตัวกรอง NetworkRequest |
| unregisterNetworkCallback() | 21 | ยกเลิกการลงทะเบียน callback |
| getActiveNetworkInfo() | 1 | เลิกใช้แล้ว ไม่ควรใช้ |
ไลบรารี Jetpack Connectivity (androidx.core:core-ktx) มีส่วนขยายที่สะดวกสำหรับการทำงานกับ ConnectivityManager ใน Compose ฟังก์ชัน ConnectivityManager.observeAsState() คืนค่า State
ConnectivityManager.NetworkCallback เป็นคลาสนามธรรมที่มีเมธอดที่ถูกเรียกโดยระบบเมื่อสถานะเครือข่ายเปลี่ยน onAvailable(Network) ถูกเรียกเมื่อเครือข่ายพร้อมใช้งาน แอปพลิเคชันได้รับ Network object ที่สามารถใช้เพื่อผูก socket ผ่าน Network.bindSocket() onLost(Network) ถูกเรียกเมื่อเครือข่ายไม่พร้อมใช้งาน แอปพลิเคชันควรสลับไปใช้ข้อมูลท้องถิ่นหรือแสดงข้อความว่าไม่มีการเชื่อมต่อ onCapabilitiesChanged(Network, NetworkCapabilities) ถูกเรียกเมื่อคุณลักษณะของเครือข่ายเปลี่ยน (เช่น เมื่อสลับจาก Wi-Fi เป็นข้อมูลมือถือ)
การจัดการการเปลี่ยนแปลงเครือข่ายอย่างถูกต้องต้องพิจารณาถึงวงจรชีวิตของคอมโพเนนต์ ต้องลงทะเบียน callback ใน onStart()/onResume() และยกเลิกใน onStop()/onPause() หากไม่ยกเลิก callback อาจยังคงทำงานหลังจาก Activity ถูกทำลาย ซึ่งทำให้เกิดหน่วยความจำรั่วและ NullPointerException ที่อาจเกิดขึ้นเมื่อ callback พยายามอัปเดต UI ของคอมโพเนนต์ที่ถูกทำลายแล้ว ใช้ lifecycleScope หรือ repeatOnLifecycle สำหรับการจัดการการลงทะเบียนอัตโนมัติ ใน Jetpack Compose ใช้ DisposableEffect สำหรับการลงทะเบียนและยกเลิก callback
การจัดการกับแคปทีฟพอร์ทัล เป็นคุณสมบัติที่สำคัญของ ConnectivityManager ตั้งแต่ Android 10 CAPTIVE_PORTAL เป็นสถานการณ์ที่เครือข่าย Wi-Fi พร้อมใช้งานแต่ต้องยืนยันตัวตนผ่านหน้าเว็บ (สนามบิน โรงแรม ร้านกาแฟ) NetworkCapabilities.NET_CAPABILITY_VALIDATED ระบุว่าเครือข่ายสามารถเข้าถึงอินเทอร์เน็ตได้อย่างเต็มที่ หากไม่มี NET_CAPABILITY_VALIDATED แอปพลิเคชันสามารถเปิดเบราว์เซอร์เพื่อยืนยันตัวตนผ่านแคปทีฟพอร์ทัล เมธอด isCaptivePortal() ที่เพิ่มใน Android 11 (API 30) ใช้สำหรับตรวจจับแคปทีฟพอร์ทัล
ConnectivityManager ช่วยให้สามารถขอใช้เครือข่ายสำหรับวัตถุประสงค์เฉพาะผ่าน requestNetwork() และ bindProcessToNetwork() ตัวอย่างเช่น แอปพลิเคชันสำหรับดาวน์โหลดไฟล์ขนาดใหญ่สามารถขอเครือข่าย Wi-Fi ได้แม้ว่าข้อมูลมือถือจะทำงานอยู่ โดยสร้าง NetworkRequest ด้วย addTransportType(TRANSPORT_WIFI) และเมื่อ Wi-Fi พร้อมใช้งาน ระบบจะเรียก onAvailable() แอปพลิเคชันผูก socket กับเครือข่ายนี้ผ่าน network.bindSocket() หรือ OkHttp ด้วย Network object ที่กำหนดค่าไว้ ซึ่งให้การควบคุมที่ยืดหยุ่นในการใช้อินเทอร์เฟซเครือข่าย
มาดูตัวอย่างที่สมบูรณ์ของการใช้ ConnectivityManager กับ API สมัยใหม่ (NetworkCallback) ใน Clean Architecture NetworkMonitor เป็นคลาส wrapper รอบ ConnectivityManager ที่ให้สถานะเครือข่ายแบบรีแอกทีฟผ่าน StateFlow ViewModel สมัครรับ Flow นี้และส่งสถานะไปยัง UI Repository ใช้ NetworkMonitor เพื่อตัดสินใจเกี่ยวกับคำขอเครือข่าย แนวทางนี้ช่วยให้สามารถทดสอบได้และแยกการพึ่งพาแพลตฟอร์ม
ตัวอย่างด้านล่างแสดงวิธีใช้ ConnectivityManager กับ registerDefaultNetworkCallback อย่างถูกต้อง คลาส NetworkMonitor ห่อหุ้มการทำงานกับบริการระบบและให้ Kotlin Flow
class NetworkMonitor(
private val connectivityManager: ConnectivityManager
) {
val isOnline: StateFlow<Boolean> = callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
trySend(true)
}
override fun onLost(network: Network) {
trySend(false)
}
override fun onCapabilitiesChanged(
network: Network,
caps: NetworkCapabilities
) {
val connected = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
trySend(connected)
}
}
connectivityManager.registerDefaultNetworkCallback(callback)
awaitClose {
connectivityManager.unregisterNetworkCallback(callback)
}
}.stateIn(
CoroutineScope(Dispatchers.Default),
SharingStarted.WhileSubscribed(5000),
initialValue = checkInitialState()
)
private fun checkInitialState(): Boolean {
val network = connectivityManager.getActiveNetwork() ?: return false
val caps = connectivityManager.getNetworkCapabilities(network) ?: return false
return caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
}
}
ViewModel สมัครรับ NetworkMonitor.isOnline ผ่าน stateIn() และส่งสถานะไปยัง Compose Repository ตรวจสอบค่า isOnline.value ปัจจุบันก่อนเรียก API: หาก false — คืน Flow จาก Room หาก true — เรียก API บันทึกผลลัพธ์ใน Room และคืน Flow จาก Room WorkManager ใช้ NetworkType.CONNECTED เพื่อจำกัดงานเบื้องหลัง การทดสอบ NetworkMonitor ทำด้วย mock ConnectivityManager object และ fake NetworkCallback ซึ่งช่วยให้สามารถจำลองสถานการณ์เครือข่ายใดๆ ในการทดสอบหน่วย
กฎข้อแรกของการทำงานกับ ConnectivityManager คือไม่ใช้ API ที่เลิกใช้แล้ว getActiveNetworkInfo() เลิกใช้ตั้งแต่ API 29 และอาจคืนข้อมูลที่ไม่ถูกต้องบน Android เวอร์ชันใหม่ ให้ใช้ getActiveNetwork() + getNetworkCapabilities() สำหรับการตรวจสอบครั้งเดียว และ registerDefaultNetworkCallback() สำหรับการตรวจสอบอย่างต่อเนื่องแทน เมธอดเก่ายังไม่แยกความแตกต่างระหว่างเครือข่ายที่มีแคปทีฟพอร์ทัลและอินเทอร์เน็ตเต็มรูปแบบ ซึ่งนำไปสู่ผลบวกปลอม
กฎข้อที่สองคือ ยกเลิกการลงทะเบียน callback เสมอ หาก Activity ลงทะเบียน NetworkCallback ใน onStart() แต่ไม่ยกเลิกใน onStop() callback จะยังคงทำงานหลังจาก Activity ถูกทำลาย ซึ่งทำให้หน่วยความจำรั่วและ NullPointerException ที่อาจเกิดขึ้นเมื่อ callback พยายามอัปเดต UI ของคอมโพเนนต์ที่ถูกทำลาย ใช้ lifecycleScope หรือ repeatOnLifecycle สำหรับการจัดการการลงทะเบียนอัตโนมัติ ใน Jetpack Compose ใช้ DisposableEffect สำหรับการลงทะเบียนและยกเลิก callback
ข้อผิดพลาดทั่วไปที่สามคือการตรวจสอบเฉพาะความพร้อมใช้งานของเครือข่ายโดยไม่พิจารณาคุณภาพ แค่ "มีอินเทอร์เน็ตหรือไม่" ไม่เพียงพอสำหรับการตัดสินใจ แอปพลิเคชันควรตรวจสอบ NET_CAPABILITY_NOT_METERED สำหรับการดาวน์โหลดไฟล์ขนาดใหญ่ NET_CAPABILITY_NOT_ROAMING สำหรับการซิงค์โครไนซ์เบื้องหลัง และ NET_CAPABILITY_VALIDATED เพื่อยืนยันการเข้าถึงอินเทอร์เน็ต การละเว้นแฟล็กเหล่านี้ทำให้แอปพลิเคชันพยายามดาวน์โหลดวิดีโอในโรมมิ่งหรือซิงค์ข้อมูลผ่านแคปทีฟพอร์ทัลของโรงแรม
กฎข้อที่สี่คือไม่ใช้ ConnectivityManager เพื่อตรวจสอบความพร้อมใช้งานของเซิร์ฟเวอร์เฉพาะ ConnectivityManager รายงานสถานะเครือข่ายบนอุปกรณ์ แต่ไม่รับประกันว่าเซิร์ฟเวอร์สามารถเข้าถึงได้ ในการตรวจสอบความพร้อมใช้งานของ API ให้ใช้คำขอ HTTP กับ timeout สั้นหรือ Health Check ConnectivityManager + HTTP ping เป็นการผสมผสานที่เชื่อถือได้: ตรวจสอบความพร้อมใช้งานของเครือข่ายก่อน จากนั้นทำคำขอเบาไปยังเซิร์ฟเวอร์เพื่อยืนยันการเข้าถึงจริง
สำหรับการทดสอบหน่วย ใช้ Robolectric กับ ShadowConnectivityManager ซึ่งช่วยจำลองสถานะเครือข่าย สำหรับการทดสอบแบบผสานรวม — Android Test Orchestrator พร้อมการสลับโหมดเครื่องบิน ในการทดสอบ ตรวจสอบสถานการณ์: การเปลี่ยนจากออนไลน์เป็นออฟไลน์ การปรากฏของ Wi-Fi เมื่อข้อมูลมือถือทำงานอยู่ การสูญเสียเครือข่ายระหว่างการดำเนินการขอ แคปทีฟพอร์ทัล โรมมิ่ง สำหรับการจำลอง (mocking) ในการทดสอบหน่วย ใช้อินเทอร์เฟซ wrapper (เช่น NetworkMonitorInterface) ที่สามารถแทนที่ด้วย mock object โดยไม่มีการพึ่งพาแพลตฟอร์ม
คำถามที่พบบ่อย
วิธีสมัยใหม่คือใช้ registerDefaultNetworkCallback() กับการตรวจสอบ NET_CAPABILITY_INTERNET ใน onCapabilitiesChanged() สำหรับการตรวจสอบครั้งเดียว: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false เมธอด getActiveNetworkInfo() ที่เลิกใช้แล้วไม่แนะนำตั้งแต่ API 29+
ในการอ่านข้อมูลเครือข่าย ต้องใช้สิทธิ์ android.permission.ACCESS_NETWORK_STATE ซึ่งเป็นสิทธิ์ปกติ — จะได้รับโดยอัตโนมัติเมื่อติดตั้งแอปพลิเคชันและไม่ต้องขอขณะทำงาน สำหรับการดำเนินการเครือข่าย (คำขอ HTTP) ต้องใช้สิทธิ์ INTERNET ด้วย
registerDefaultNetworkCallback() ตรวจสอบเครือข่ายเริ่มต้น — เครือข่ายที่แอปพลิเคชันส่งทราฟฟิกหลัก registerNetworkCallback(NetworkRequest) ตรวจสอบเครือข่ายที่ตรงกับตัวกรองที่กำหนด (เช่น Wi-Fi เท่านั้น) callback เริ่มต้นง่ายกว่าและครอบคลุม 90% ของสถานการณ์ ในขณะที่คำขอแบบกำหนดเองสำหรับข้อกำหนดประเภทเครือข่ายเฉพาะ
ใช้ NetworkCapabilities: caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) สำหรับ Wi-Fi, hasTransport(TRANSPORT_CELLULAR) สำหรับข้อมูลมือถือ อย่าใช้ ConnectivityManager.getActiveNetworkInfo().getType() — เมธอดนี้เลิกใช้แล้ว NetworkCapabilities สามารถเข้าถึงได้ผ่าน connectivityManager.getNetworkCapabilities(network)
getActiveNetworkInfo() เลิกใช้เนื่องจากไม่แม่นยำ: ไม่แยกความแตกต่างระหว่างเครือข่ายที่มีแคปทีฟพอร์ทัลและอินเทอร์เน็ตเต็มรูปแบบ และไม่ให้ข้อมูลเกี่ยวกับแบนด์วิดท์หรือโรมมิ่ง ตั้งแต่ Android 10 เมธอดนี้อาจคืนค่า null หรือข้อมูลที่ไม่ถูกต้องสำหรับการเชื่อมต่อหลายเครือข่าย ทางเลือกคือ getActiveNetwork() + NetworkCapabilities
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม