背景:公司有款产品内置wifi模块,需要Android端提供接口供前端uni-app去调用。主要功能分为开启wifi、关闭wifi、连接wifi。
重点:以下会涉及Android10以下以及Android10(包括harmony系统)以上的连接方法。
记得在配置文件中声明权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
1.首先判断有没有开启wifi,未开启则提示开启(同)
//判断wifi开启和关闭
public boolean isWifi() {
WifiManager wifiManager = (WifiManager)
getApplicationContext().getSystemService(WIFI_SERVICE);
if(wifiManager.isWifiEnabled()) {
return true;
} else {
return false;
}
}
2.开启连接指定的目标wifi(异)
(1)Android10以下连接方法,首先获取前端传入的两个参数,分别是wifi名称和wifi密码
//Android 10 以下版本wifi连接
public boolean linkWifi(String ssid, String pass) {
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
WifiConfiguration conf = new WifiConfiguration();
//如果有连接隐藏wifi需求的话,增加conf.hiddenSSID = true这句代码,加上此句则可以检索到隐藏wifi
//conf.hiddenSSID = true;
conf.SSID = "\"" + networkSSID + "\"";
//对于WPA网络密码采用以下输入方式
conf.preSharedKey = "\"" + networkPass + "\"";
wifiManager.addNetwork(conf);
@SuppressLint("MissingPermission") List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for (WifiConfiguration i : list) {
if (i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
wifiManager.disconnect();
wifiManager.enableNetwork(i.networkId, true);
wifiManager.reconnect();
break;
}
}
return true;
}
(2)Android10以上连接方法(P2P),首先获取前端传入的两个参数,分别是wifi名称和wifi密码
public boolean linkWifi (String ssid, String pass) throws InterruptedException{
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
{
NetworkSpecifier specifier =
new WifiNetworkSpecifier.Builder()
.setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX))
.setWpa2Passphrase(pass)
.build();
NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build();
ConnectivityManager connectivityManager = (ConnectivityManager)
getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
//表示使用该网络
connectivityManager.bindProcessToNetwork(network);
}
@Override
public void onUnavailable() {
return;
}
};
connectivityManager.requestNetwork(request, networkCallback);
// Release the request when done.
// connectivityManager.unregisterNetworkCallback(networkCallback);
}
return true;
}
3.断开当前所连接的wifi
@RequiresApi(api = Build.VERSION_CODES.M)
public boolean recoverywifi ()
{
//Android 10 以上断开方法
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
ConnectivityManager connectivityManager =(ConnectivityManager)
getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.bindProcessToNetwork(null);
WifiManager wifiManager = (WifiManager)
getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.disconnect();
}
else{
//Android 10 以下断开方法
WifiManager wifiManager =
(WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.disconnect();
}
return true;
}
小结:Android10以上的手机调用连接wifi代码的时候都会出现弹窗,需要用户允许才能连接目标wifi,属于正常现象。硬件的配置、手机的性能、信号的强弱都会对连接wifi的速度有影响,所以连接过程中检索转圈属于正常现象。