检查设备是否连接到WiFi接入点或移动热点?

时间:2019-08-22 09:23:21

标签: android

要求:-仅当设备仅连接到实际的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。

因此,不幸的是,该解决方案不是确定设备是否已连接到移动热点的确切方法。

请帮助我提供解决方案,以检查设备是否已连接到移动热点。

4 个答案:

答案 0 :(得分:0)

连接发生更改后,您可以使用广播接收器检查是否已连接到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")
    }
}

要确定所连接网络的运营商,您可以从here获取一个帐户。 只需使用您的令牌拨打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调用,则可以免费使用此服务。

答案 1 :(得分:0)

我对此进行了一些研究,发现所有MOBILE DEVICES都使用192.168.43.1 to 192.168.43.254的ipv4范围,因此可以在此基础上将移动AP与ACTUAL wifi区别开。 / p>

我写了一些代码使其清晰:

  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是否在此范围内。

答案 2 :(得分:0)

检查网络的默认网关可以解决此问题。通常,热点网关无法访问,因为只要您在浏览器中点击默认网关地址,路由器网关就会加载其默认设置页面或登录页面。

答案 3 :(得分:-3)

使用该库,我会立即更新。

/bucketName/dataDir