【问题标题】:Check if the device is connected to WiFi access point or Mobile hotspot?检查设备是否连接到 WiFi 接入点或移动热点?
【发布时间】:2019-08-22 09:23:21
【问题描述】:

要求:- 需要运行一些网络呼叫,仅当设备仅连接到实际 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。

因此,很遗憾,此解决方案并不是确定设备是否连接到移动热点的确切方法。

请帮助我检查设备是否连接到移动热点。

【问题讨论】:

  • 一般来说mobile hotspotWiFi access point没有区别。事实上,每个mobile hotspot 本身就是WiFi access point。同样,一些 WIFI 路由器具有 SIM 卡插槽或用于移动调制解调器连接的 USB。
  • 感谢@Vladyslav 的更多解释,但我想检查移动热点/接入点的来源是否为 2G/3G/4G,然后我不得不忽略它。
  • 我不认为您可以检查来源。我能想到的唯一一件事-通过IP地址检查ISP。因此,如果 ISP 在移动运营商列表中 - 那么它可能是移动网络
  • 请你帮我看看如何从IP地址找到ISP的代码,以便我们弄清楚它是否是移动运营商。
  • 没有这样的代码。你需要找到这样的在线API才能从IP地址获取ISP

标签: android


【解决方案1】:

我对此进行了一些研究,发现所有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 是否在此范围内。

【讨论】:

  • 我有以下相同的查询。 - 如果 IP 地址是 IPv6 怎么办? - wm.getConnectionInfo().getIpAddress() 找到移动热点的 IP ?请确认。 - 正如你所说的192.168.43.1到192.168.43.254,是IPv4的范围,请告诉我在哪里提到?无论如何,感谢您在这里所做的一切努力。 :)
  • 嘿,根据您的问题,这里是答案,> 如果 IP 地址基于 IPv6,那么此方法将不起作用,因为我们没有足够的 android 设备将 IPv6 分配给其连接的设备,因此它难以根据品牌/型号预测 IPv6 地址。 > wm.getConnectionInfo().getIpAddress() 查找手机连接到 WIFI 时分配给手机的实际 ip。 > 经过多次测试,Android 设备在此 IPv4 地址范围内运行参考:stackoverflow.com/questions/17302220/…
【解决方案2】:

一旦连接发生变化,您可以使用广播接收器检查您是否已连接到 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 调用,您可以免费使用此服务。

【讨论】:

  • 无论如何,不​​推荐使用广播接收器。我不使用任何第三方网址。如果有任何方法可以通过 android API 检查它是否连接到 WiFi 接入点或移动热点,请帮助我。
  • 无论如何,不​​推荐使用广播接收器。谁告诉你,没有任何第三方 API,我认为没有可能的解决方案@Priyavrat
  • developer.android.com/reference/android/net/ConnectivityManager 请通过这个,它告诉连接管理器不推荐使用的 API。
  • @Priyavrat 对于每个不推荐使用的方法,谷歌提供了另一种方法。为此目的有NetworkCallback,这是较新的方法
  • 同意你@Manoj,对于每个弃用的方法都有替代方法,顺便说一下我已经在使用NetworkCallback,但是没有这样的方法来识别,如果我们能找到它是否是连接到移动接入点或实际的 wifi 接入点。请让我知道,如果你能以同样的方式提供帮助,否则我们可以在这里结束讨论。感谢您的所有帮助。
【解决方案3】:

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

【讨论】:

  • 欢迎来到 Stack Overflow。您似乎误解了这个问题,即询问如何编写代码来检查设备是否连接到 Wi-Fi。您已经回答了一个关于修复网络错误的完全不相关的问题。
【解决方案4】:

使用这个库,我会立即更新。

implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.4'

【讨论】:

  • 请你告诉我,这个库是做什么的。如果您将 url/ 链接共享到相同的内容,那也很棒。
  • 您可以查看移动数据或wifi的连接状态
  • 这不是我需要的。我需要检查连接的 Wifi 网络是否是移动热点。请检查问题。
  • 这不是答案。您没有提供有关此库如何工作、它做什么或如何解决问题的信息。您甚至没有提供有关此库的文档链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多