• Android--ConnectivityManager使用


    一、前言

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

    二、连接WIFI

    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();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述
    连接时会有一个弹窗,点击连接会进行连接,之后会触发相应的回调
    在回调内部类中还有多个回调方法,具体可以看ConnectivityManager
    但是有一个问题,如果这个网络之前被连接过,在弹窗还没点确定时,这个WIFI就会连接,连接成功触发onAvailable回调,如果此时再点连接,会断开连接触发onLost,然后再重新连接

    二、扫描WIFI网络

    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) {
        // 扫描失败处理
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

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

    三、资源释放

            if(isNetworkCallbackRegistered){
                connManager.unregisterNetworkCallback(networkCallback);
                isNetworkCallbackRegistered = false;
            }
    
    • 1
    • 2
    • 3
    • 4

    在onDestroy或者不再使用WIFI时,要调用connManager.unregisterNetworkCallback(networkCallback);
    这不会立即断开WIFI,相当于是把这个WIFI弄成了一个弱引用,什么时候断由系统决定

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

  • 相关阅读:
    yml文件构建容器
    使用FastWiki一分钟搭建公司的智能客服
    OAuth2+JWT新一代认证技术
    ARM汇编
    当我们在谈论构造函数注入的时候我们在谈论什么
    设置nohup java -jar命令将日志写入test.log文件
    反制小技巧-利用访客记录获取攻击者社交ID
    依图语音API的C#封装以及调用进行语音转写的处理
    Folyd
    glibc 2.23 源码分析 | malloc & free
  • 原文地址:https://blog.csdn.net/qq_56892136/article/details/137929023