Android--ConnectivityManager使用

一、前言

Android10之后官方废弃了通过WifiManager连接WIFI的方式,现在要使用ConnectivityManager连接WIFI

二、连接WIFI

java 复制代码
public class MainActivity extends AppCompatActivity {
	private static final String TAG="lkx";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获取ConnectivityManager实例
		ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

		// 创建一个NetworkCallback对象,用于监听连接状态
		ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
			@Override
			public void onAvailable(Network network) {
				// 网络可用时的回调
				Log.d(TAG, "WIFI网络已连接");
			}

			@Override
			public void onLost(Network network) {
				// 网络丢失时的回调
				Log.d(TAG, "WIFI网络已断开");
			}
		};

		// 请求连接WIFI网络
		connectivityManager.requestNetwork(request, networkCallback);
	}
	// 创建一个NetworkSpecifier对象,用于指定要连接的WIFI网络
	WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
		.setSsid("Redmi K60 Pro") // 设置SSID
		.setWpa2Passphrase("11111111") // 设置密码,对于开放网络,可以省略这一步
		.build();

	// 创建一个NetworkRequest对象,用于请求连接
	NetworkRequest request = new NetworkRequest.Builder()
		.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 指定传输类型为WIFI
		.setNetworkSpecifier(specifier) // 设置NetworkSpecifier
		.build();

}

连接时会有一个弹窗,点击连接会进行连接,之后会触发相应的回调

在回调内部类中还有多个回调方法,具体可以看ConnectivityManager

但是有一个问题,如果这个网络之前被连接过,在弹窗还没点确定时,这个WIFI就会连接,连接成功触发onAvailable回调,如果此时再点连接,会断开连接触发onLost,然后再重新连接

二、扫描WIFI网络

java 复制代码
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

// 注册一个 BroadcastReceiver 来监听扫描结果
BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
        if (success) {
            scanSuccess();
        } else {
            // 扫描失败处理
            scanFailure();
        }
    }

    private void scanSuccess() {
        List<ScanResult> results = wifiManager.getScanResults();
        for (ScanResult result : results) {
            if (result.SSID.equals(selectAp.SSID)) {
                // 找到匹配的SSID,获取信号强度
                int signalLevel = WifiManager.calculateSignalLevel(result.level, 100);
                Log.d(TAG, "Found SSID: " + result.SSID + ", Signal Strength: " + signalLevel);
                // 根据需要处理信号强度
            }
        }
    }

    private void scanFailure() {
        // 处理扫描失败的情况,可能需要重新扫描或者显示错误信息
    }
};

// 注册 BroadcastReceiver
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiScanReceiver, intentFilter);

// 开始扫描
boolean success = wifiManager.startScan();
if (!success) {
    // 扫描失败处理
}

扫描WIFI网络还是使用的WifiManager ,调用startScan方法开始扫描,之后会发送一个广播,需要APK接受这个广播,之后通过wifiManager.getScanResults()来获取所有WIFI的相关信息列表,上面代码是查询指定WIFI名字的信号强度

三、资源释放

java 复制代码
        if(isNetworkCallbackRegistered){
            connManager.unregisterNetworkCallback(networkCallback);
            isNetworkCallbackRegistered = false;
        }

在onDestroy或者不再使用WIFI时,要调用connManager.unregisterNetworkCallback(networkCallback);

这不会立即断开WIFI,相当于是把这个WIFI弄成了一个弱引用,什么时候断由系统决定

如果没有调用requestNetwork就调用unregisterNetworkCallback会抛出异常,所以最好加一个变量来判断是否需要调用unregisterNetworkCallback

相关推荐
盗骊15 分钟前
Android 终端模拟器 termux app
android
androidwork40 分钟前
Kotlinx序列化多平台兼容性详解
android·java·kotlin
范纹杉想快点毕业42 分钟前
Qt、C++自定义按钮、组件、事件编程开发练习,万字实战解析!!
java·c语言·开发语言·c++·git·qt·github
恰薯条的屑海鸥1 小时前
零基础学前端-传统前端开发(第四期-JS基础)
开发语言·前端·javascript·javascript基础·前端入门·javascript教程
m0_619731191 小时前
C语言之内存对齐
c语言·开发语言
于本淡1 小时前
一篇文章快速学会CSS
开发语言·前端·css·数据结构·html·github
Allen Bright1 小时前
【JS-4.3-鼠标常用事件】深入理解DOM鼠标事件:全面指南与最佳实践
开发语言·javascript
真的想上岸啊2 小时前
学习C++、QT---03(C++的输入输出、C++的基本数据类型介绍)
开发语言·c++·学习
青春:一叶知秋2 小时前
【Qt开发】网络运用
开发语言·qt