簡體   English   中英

檢查設備是否連接到 WiFi 接入點或移動熱點?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM