要求:-仅当设备仅连接到实际的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。
因此,不幸的是,该解决方案不是确定设备是否已连接到移动热点的确切方法。
请帮助我提供解决方案,以检查设备是否已连接到移动热点。
答案 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