android 10 wifi操作

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;
    }
}
相关推荐
Kevin Coding3 小时前
Flutter使用Flavor实现切换环境和多渠道打包
android·flutter·ios
yashunan3 小时前
Web_php_unserialize
android·前端·php
taopi20244 小时前
android java系统弹窗的基础模板
android·java·开发语言
志尊宝5 小时前
深入探索 Android 技术:从基础到前沿
android
字节全栈_BjO6 小时前
mysql死锁排查_mysql 死锁问题排查
android·数据库·mysql
恋猫de小郭20 小时前
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
android·ide·android studio
aaaweiaaaaaa1 天前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
工程师老罗1 天前
Android记事本App设计开发项目实战教程2025最新版Android Studio
android
pengyu1 天前
系统化掌握 Dart 编程之异常处理(二):从防御到艺术的进阶之路
android·flutter·dart
消失的旧时光-19431 天前
android Camera 的进化
android