#android #kotlin #android-connectivitymanager
Вопрос:
Когда устройство Android не подключено к Интернету, я собираюсь проверить, можно ли подключить Wi-Fi к данным в режиме реального времени и подключиться к определенному Wi-Fi.
Данные о соединении
private val TAG = "ConnectionLiveData" class ConnectionLiveData(context: Context) : LiveDatalt;Booleangt;() { private lateinit var networkCallback: ConnectivityManager.NetworkCallback private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager private val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager private val validNetworks: MutableSetlt;Networkgt; = HashSet() private fun checkValidNetworks() { postValue(validNetworks.size gt; 0) } override fun onActive() { networkCallback = createNetworkCallback() val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build() connectivityManager.registerNetworkCallback(networkRequest, networkCallback) } override fun onInactive() { connectivityManager.unregisterNetworkCallback(networkCallback) } private fun createNetworkCallback() = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { Log.d(TAG, "---Location onAvailable: $network") val networkCapabilities = connectivityManager.getNetworkCapabilities(network) val hasInternetCapability = networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) Log.d(TAG, "---Location onAvailable: $network, $hasInternetCapability") if (hasInternetCapability == true) { CoroutineScope(Dispatchers.IO).launch { val hasInternet = DoesNetworkHaveInternet.execute(network.socketFactory) if (hasInternet) { withContext(Dispatchers.Main) { Log.d(TAG, "onAvailable: adding network. $network") validNetworks.add(network) checkValidNetworks() } } } }else { Log.d(TAG, "There is no active network") } } override fun onLost(network: Network) { Log.d(TAG, "The application no longer has a default network. The last default network was $network" ) validNetworks.remove(network) checkValidNetworks() } override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { Log.d(TAG, "The default network changed capabilities: $networkCapabilities") } override fun onLinkPropertiesChanged( network: Network, linkProperties: LinkProperties ) { Log.d(TAG, "The default network changed link properties: $linkProperties") } } }
Диспетчер соединений
@Singleton class ConnectivityManager @Inject constructor( application: Application, ) { private val connectionLiveData = ConnectionLiveData(application) // observe this in ui val isNetworkAvailable = mutableStateOf(false) fun registerConnectionObserver(lifecycleOwner: LifecycleOwner){ connectionLiveData.observe(lifecycleOwner) { isConnected -gt; isConnected?.let { isNetworkAvailable.value = it } } } fun unregisterConnectionObserver(lifecycleOwner: LifecycleOwner){ connectionLiveData.removeObservers(lifecycleOwner) } }
А затем, когда я подключаю Wi-Fi, он регистрируется вот так.
2021-11-27 10:09:10.808 28100-28143/com.connectapp D/ConnectionLiveData: ---Location onAvailable: 152 2021-11-27 10:09:10.810 28100-28143/com.connectapp D/ConnectionLiveData: ---Location onAvailable: 152, true 2021-11-27 10:09:10.812 28100-28143/com.connectapp D/ConnectionLiveData: The default network changed capabilities: [ Transports: WIFI Capabilities: NOT_METEREDamp;INTERNETamp;NOT_RESTRICTEDamp;TRUSTEDamp;NOT_VPNamp;VALIDATEDamp;NOT_ROAMINGamp;FOREGROUNDamp;NOT_CONGESTEDamp;NOT_SUSPENDED LinkUpBandwidthgt;=1048576Kbps LinkDnBandwidthgt;=1048576Kbps SignalStrength: -56] 2021-11-27 10:09:10.814 28100-28143/com.connectapp D/ConnectionLiveData: The default network changed link properties: {Network Interface} 2021-11-27 10:09:10.885 28100-28100/com.connectapp D/ConnectionLiveData: onAvailable: adding network. 152
Но когда я удаляю сохраненные данные Wi-Fi на устройстве, он не возвращает журнал Поэтому мой вопрос заключается в следующем: когда устройство Android не подключено к Интернету, подключитесь к определенному Wi-Fi. Как я могу его подключить?
Комментарии:
1. Не обращаясь к документации, я предполагаю, что они никоим образом не позволят приложениям делать это по соображениям безопасности.
2. @Thenfour04 Не могли бы вы рассказать мне больше о соображениях безопасности?