Android获取Wifi的数据

Android获取Wifi的数据

在anndroid中使用系統功能SystemService获取当前wifi状态。

常用获取办法

WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();

然后可以使用currectWIfi的getSSID,getBSSID(Mac),getNetId等。
注意:getAddress这个函数被弃用,现在应该只能返回02:00:00:00:00:00

Unknown ssid 和 02:00:00:00:00:00 问题

获取wifi 的ssid出现 ,获取bssid和mac获得 02:00:00:00:00:00 的问题,本质上是权限的缺失,Android的系统权限总体来说是处于不断收紧的状态,使用android的系统功能越来越复杂,在android 8.0 后,必须要打开定位的权限该App才能够使用权限,权限的申请如下所示:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

当然,即使在Manfiest中进行了权限的申请也不一定可以,因为我在小米的机型上测出了不会弹出权限询问弹窗的问题,这个时候就只能手动开启定位权限了吗?//TODO: 跟进权限请求弹窗不弹的问题

WifiManager

此对象为Android的系统功能,一般只能从Context#getApplicationContext()获取,而不能从任何其他派生上下文获取,以避免调用过程中内存泄漏(参考文档1)。 这是执行Wi-Fi特定操作时要使用的API,它的作用主要有:

  • 获取已配置网络的列表(曾经连接过的保存的wifi) ,获取当前所连wifi的数据
  • 断开当前连接或连接任意一个已配置网络(为配置网络因为没有netid应该无法在App中自动连接)
  • 定义了在Wi-Fi状态发生任何变化时广播的各种意图动作的名称。

ConnectivityManager

值得一提的是,在API29中,NetworkInfo这个类被弃用,所以ConnectivityManager的API发生了巨大的变化,例如getActiveNetworkInfo等返回值为NetworkInfo的API全部被弃用,转而使用getActiveNetwork等返回值是Network类的API,具体可以参考官方文档。

参考文献

  1. 浅析Context及可能带来的内存泄漏问题 : https://blog.csdn.net/u012403246/article/details/46285151
  2. ConnectivityManager Android 官方文档:https://developer.android.google.cn/reference/kotlin/android/net/ConnectivityManager.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,可以通过 `ConnectivityManager` 来监听网络连接状态的变化,包括 WiFi 和移动数据的切换。 具体实现步骤如下: 1. 在 `AndroidManifest.xml` 中添加以下权限: ```xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> ``` 2. 在需要进行监听的 `Activity` 或 `Service` 中,创建一个 `ConnectivityManager.NetworkCallback` 的回调类: ```java private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { // 网络连接可用 super.onAvailable(network); Log.d(TAG, "onAvailable: " + network); } @Override public void onLost(Network network) { // 网络连接丢失 super.onLost(network); Log.d(TAG, "onLost: " + network); } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { // 网络连接属性变化 super.onCapabilitiesChanged(network, networkCapabilities); Log.d(TAG, "onCapabilitiesChanged: " + networkCapabilities); } }; ``` 3. 在 `onCreate()` 方法中获取 `ConnectivityManager` 对象,并注册监听回调: ```java ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); connectivityManager.registerNetworkCallback(new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) // 监听移动数据连接 .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 监听 WiFi 连接 .build(), networkCallback); ``` 4. 在 `onDestroy()` 方法中取消监听回调: ```java connectivityManager.unregisterNetworkCallback(networkCallback); ``` 这样,就可以监听网络连接状态的变化,包括 WiFi 和移动数据的切换了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值