[英]Check if the device is connected to WiFi access point or Mobile hotspot?
要求:- 需要運行一些網絡呼叫,僅當設備僅連接到實際的 WiFi 接入點,而不是移動熱點或蜂窩數據時。
我們需要檢查當前連接的網絡是否是移動熱點。 目前,如果它連接到 WiFi 或蜂窩網絡,我正在使用以下代碼。
Network activeNetwork = connectivityManager.getActiveNetwork();
NetworkCapabilities networkCapabilities = mConnectivityManager.getNetworkCapabilities(activeNetwork);
boolean isWiFi = networkCapabilities.hasTransport(NetworkCapablities.TRANSPORT_WIFI);
為了確定 wifi 連接是否是移動熱點,我嘗試了一種解決方法,使用以下方法。
connectivityManager.isActiveNetworkMetered()
隨着活動連接計量檢查,更新條件如下
boolean isWiFiNotAMobileHotspot = networkCapablities.hasTransport(NetworkCapablities.TRANSPORT_WIFI) && connectivityManager.isActiveNetworkMetered();
由於 isActiveNetworkMetered() 僅有助於識別我們是否連接了計量連接(具有每日/每月數據限制的限制。)
因此,對於大多數移動熱點,它給出了預期的結果,但如果移動熱點具有無限數據計划,則 isActiveNetworkMetered() 返回 false。
因此,不幸的是,此解決方案並不是確定設備是否已連接到移動熱點的准確方法。
請幫助我解決檢查設備是否連接到移動熱點的解決方案。
一旦連接發生變化,您可以使用廣播接收器來檢查您是否已連接到 Wi-Fi。
class NetworkChangeReceiver(private val application: Application) :
ConnectivityManager.NetworkCallback() {
private val NETWORK_CHANGE_TAG = NetworkChangeReceiver::class.java.simpleName
private var networkRequest: NetworkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
init {
val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.registerNetworkCallback(networkRequest, this)
}
override fun onAvailable(network: Network?) {
super.onAvailable(network)
Timber.i(NETWORK_CHANGE_TAG.plus("onAvailable"))
application.toast("onAvailable")
}
override fun onLost(network: Network?) {
super.onLost(network)
Timber.i(NETWORK_CHANGE_TAG.plus("onLost"))
application.toast("onLost")
}
}
要確定所連接網絡的運營商,您可以從此處獲取帳戶。 只需使用您的令牌撥打https://ipinfo.io?token=$TOKEN
。
您將收到一個 JSON 響應,其中包含所連接網絡的完整詳細信息。 例如:
ip: "115.xxx.xx.xxx"
city: ""
region: ""
country: "IN"
loc: "2x.0000,7x.0000"
asn: Object
asn: "AS18101"
name: "Reliance Communications Ltd"
domain: "reliance.com"
route: "115.xxx.xx.0/22"
type: "isp"
company: Object
name: "RCOM-Static-DIA"
domain: "reliance.com"
type: "isp"
abuse: Object
address: "Reliance Communication Ltd"
country: "IN"
email: "support@reliance.com"
name: "Antiabus"
network: "115.xxx.xx.0/20"
phone: "xx30334141-5"
如果您每月只需要少於 5 萬次 API 調用,您可以免費使用此服務。
我對此進行了一些研究,發現所有MOBILE DEVICES
使用192.168.43.1 to 192.168.43.254
的 ipv4 范圍,因此可以在此基礎上區分移動 AP 和 ACTUAL wifi。
我寫了一些代碼來說明:
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
System.out.println(ip);
String []wifi_ip = ip.split(".");
if(wifi_ip[3].equals(43)){
if(parseInt(wifi_ip[4])>=1 && parseInt(wifi_ip[4])<=254){
//your code goes here
}
}
將此添加到您的清單中
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
這段代碼有什么作用?
它實際上檢查設備的 IPv4 地址,然后檢查設備的 ip 是否在此范圍內。
檢查網絡的默認網關解決了這個問題。一般來說,熱點網關是無法訪問的,因為只要您在瀏覽器中點擊默認網關地址,路由器網關就會加載它們的默認設置頁面或登錄頁面。
使用這個庫我會立即更新。
implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.4'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.