行业知识
android通过代码连接wifi
2026-11-01 09:57:57
来源:互联网转载
Android SDK API 29(对应Android 10)以下,可以在app之中通过代码直接设置wifi名称和密码进行连接。
API 29及其以上版本,增加了动态管理权限功能,弃用了之前的接口,同时app连接wifi时必须通过用户同意,具体方式是弹出一个页面显示要连接的wifi,用户点击连接之后再返回app。
1. API
a. 首先初始化,检查权限,若无则申请权限
//检查wifi权限if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //若无则申请 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);}else{ //初始化 wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);} b. 扫描wifi,以供后续操作,若不执行这一步直接连接则会出错:
//扫描并列出wifi,以供后续操作wifiScanReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false); if (success) { scanResults = wifiManager.getScanResults(); for (ScanResult scanResult : scanResults) { String SSID = scanResult.SSID; String BSSID = scanResult.BSSID; String capabilities = scanResult.capabilities; int level = scanResult.level; Log.d("WIFISCAN", "SSID: " + SSID + ", BSSID: " + BSSID); } } }};IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);registerReceiver(wifiScanReceiver, intentFilter);wifiManager.startScan(); c. 连接指定wifi,此处为了演示直接填写ssid和密码,实际情况之中可以从上一步的wifi列表之中选取,并由用户输入(api>=29时这一步是可以运行,但无连接wifi的效果):
WifiConfiguration wifiConfiguration = new WifiConfiguration();//注意,密码和SSID两边必须再加一对双引号!!!wifiConfiguration.SSID = "\"wifi SSID\""; wifiConfiguration.preSharedKey = "\"password\"";int networkId = wifiManager.addNetwork(wifiConfiguration);//wifiManager.disconnect(); //断开链接wifiManager.enableNetwork(networkId, true);wifiManager.reconnect();Log.d("ConnectWifi", "reconnect ok!"); 2. API
GitHub - ThanosFisherman/WifiUtils: Easily Connect to WiFi Networks
更加简单,适用于api小于29的android,api>29时无法正常搜索到wifi:
//开启wifiWifiUtils.withContext(getApplicationContext()).enableWifi(); //搜索wifiWifiUtils.withContext(getApplicationContext()).scanWifi(this::getScanResults).start();
处理搜索结果:
private void getScanResults(@NonNull final List results){ if (results.isEmpty()) { Log.i(TAG, "SCAN RESULTS IT'S EMPTY"); return; } Log.i(TAG, "GOT SCAN RESULTS " + results);} 若不为空,则连接指定wifi:
//连接wifiWifiUtils.withContext(getApplicationContext()) .connectWith("wifi SSID", "password") .setTimeout(40000) .onConnectionResult(new ConnectionSuccessListener() { @Override public void success() { Toast.makeText(MainActivity.this, "SUCCESS!", Toast.LENGTH_SHORT).show(); } @Override public void failed(@NonNull ConnectionErrorCode errorCode) { Toast.makeText(MainActivity.this, "EPIC FAIL!" + errorCode.toString(), Toast.LENGTH_SHORT).show(); } }) .start(); 3. API >= 29
API大于29时,弃用了WifiConfiguration这个更加底层可以直接操作的类。但是初始化和搜索wifi列表的代码与API
上一篇:自测-2 素数对猜想
下一篇:net服务器怎么设置不能用?