android 10及以上wifi发生了变化,android 10及以下代码需要适配。
android 10及以上:
1.权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
2.动态申请位置权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
if(ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions((Activity) context, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
ActivityCompat.requestPermissions((Activity) context, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
}
3.android 10以下打开wifi,android 10及以上无法再使用代码打开,需要手动到设置中打开。
/**
* 打开WIFI(该方法会阻塞线程)
*
* @param context
*/
public static void openWifi(Context context) {
if (Build.VERSION.SDK_INT < 29) {
WifiManager wifiManager = getWifiManager(context);
if (!wifiManager.isWifiEnabled()) {
Log.i(TAG, "wifi is not Enabled");
boolean isEnabled = wifiManager.setWifiEnabled(true);
Log.i(TAG, "isEnabled:" + isEnabled);
// 开启wifi功能需要一段时间,所以要等到wifi
// 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句
while (wifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLED) {
try {
// 为了避免程序一直while循环,让它睡个100毫秒检测……
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
} else {
Log.i(TAG, "wifi is Enabled");
}
} else {
//Android 10 不支持代码打开WiFi开关,需要用户跳转系统界面自行打开开关
}
}
4.连接wifi:
public boolean connect(Context context,WifiConfiguration wcg)
{
final boolean[] isConnected = {false};
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
{
try {
NetworkSpecifier specifier =
new WifiNetworkSpecifier.Builder()
.setSsidPattern(new PatternMatcher(WifiSSID, PatternMatcher.PATTERN_PREFIX))
.setWpa2Passphrase(WifiPASSWORD)
.build();
NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build();
ConnectivityManager connectivityManager = (ConnectivityManager)
mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
Log.i(TAG,"WiFi连接成功");
System.out.println("wifiInfo=================");
isConnected[0] = true;
}
@Override
public void onUnavailable() {
Log.i(TAG,"WiFi连接失败,请手动连接");
}
};
// connectivityManager.registerNetworkCallback(request,networkCallback);
connectivityManager.requestNetwork(request,networkCallback);
} catch (SecurityException e){
e.printStackTrace();
} catch (IllegalArgumentException e){
e.printStackTrace();
} catch (RuntimeException e){
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return isConnected[0];
}else{
WifiManager wifiManager = getWifiManager(context);
int wcgID = wifiManager.addNetwork(wcg);
boolean b = wifiManager.enableNetwork(wcgID, true);
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
int count = 0;
while (true) {
count++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ConnectivityManager conMan = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo.State wifi = conMan.getNetworkInfo(
ConnectivityManager.TYPE_WIFI).getState();
if (NetworkInfo.State.CONNECTED == wifi) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
if (count > 6000) {
b = false;
break;
}
}
System.out.println("connect SSID:" + wcg.SSID);
System.out.println("connect wcgID:" + wcgID);
System.out.println("connect enableNetwork:" + b);
return b;
}
}