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() {@Overridepublic void onAvailable(Network network) {Log.i(TAG,"WiFi连接成功");System.out.println("wifiInfo=================");isConnected[0] = true;}@Overridepublic 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 blocke1.printStackTrace();}int count = 0;while (true) {count++;try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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 blocke.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;} }