【Qt for android 之wifi 扫描 连接 断开】

1.运行效果

请添加图片描述

android 端代码


import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.qtproject.example.ConverFromGBKToUTF8;
public class BaseWiFiManager {
   private static final String TAG = "jason";
     static WifiManager mWifiManager;
        private List<WifiBean> mNewWifiLists =new ArrayList<>();
        private static ConnectivityManager mConnectivityManager;


        BaseWiFiManager(Context context) {
            // 取得WifiManager对象
            mWifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            if (mWifiManager == null) {
                throw new RuntimeException("WifiManager is not supposed to be null");
            }
            mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        }




        /**
         * 添加开放网络配置
         *
         * @param ssid SSID
         * @return NetworkId
         */
        int setOpenNetwork(String ssid) {
            if (TextUtils.isEmpty(ssid)) {
                return -1;
            }
            WifiConfiguration wifiConfiguration = getConfigFromConfiguredNetworksBySsid(ssid);
            if (null == wifiConfiguration) {
                // 生成配置
                WifiConfiguration wifiConfig = new WifiConfiguration();
                wifiConfig.SSID = addDoubleQuotation(ssid);
                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                wifiConfig.allowedAuthAlgorithms.clear();
                wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                // 添加配置并返回NetworkID
                return addNetwork(wifiConfig);
            } else {
                // 返回NetworkID
                return wifiConfiguration.networkId;
            }
        }

        /**
         * 添加WEP网络配置
         *
         * @param ssid     SSID
         * @param password 密码
         * @return NetworkId
         */
        int setWEPNetwork(String ssid, String password) {
            if (TextUtils.isEmpty(ssid) || TextUtils.isEmpty(password)) {
                return -1;
            }
            WifiConfiguration wifiConfiguration = getConfigFromConfiguredNetworksBySsid(ssid);
            if (null == wifiConfiguration) {
                // 添加配置
                WifiConfiguration wifiConfig = new WifiConfiguration();
                wifiConfig.SSID = addDoubleQuotation(ssid);
                wifiConfig.wepKeys[0] = "\"" + password + "\"";
                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
                wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
                wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
                // 添加配置并返回NetworkID
                return addNetwork(wifiConfig);
            } else {
                // 更新配置并返回NetworkID
                wifiConfiguration.wepKeys[0] = "\"" + password + "\"";
                return updateNetwork(wifiConfiguration);
            }
        }

        /**
         * 添加WPA网络配置
         *
         * @param ssid     SSID
         * @param password 密码
         * @return NetworkId
         */
        int setWPA2Network( String ssid,  String password) {
            if (TextUtils.isEmpty(ssid) || TextUtils.isEmpty(password)) {
                return -1;
            }
            WifiConfiguration wifiConfiguration = getConfigFromConfiguredNetworksBySsid(ssid);
            if (null == wifiConfiguration) {
                WifiConfiguration wifiConfig = new WifiConfiguration();
                wifiConfig.SSID = addDoubleQuotation(ssid);
                wifiConfig.preSharedKey = "\"" + password + "\"";
                wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                wifiConfig.status = WifiConfiguration.Status.ENABLED;
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                // 添加配置并返回NetworkID
                return addNetwork(wifiConfig);
            } else {
                // 更新配置并返回NetworkID
                wifiConfiguration.preSharedKey = "\"" + password + "\"";
                return updateNetwork(wifiConfiguration);
            }
        }

        /**
         * 通过热点名获取热点配置
         *
         * @param ssid 热点名
         * @return 配置信息
         */
        public WifiConfiguration getConfigFromConfiguredNetworksBySsid( String ssid) {
            ssid = addDoubleQuotation(ssid);
            List<WifiConfiguration> existingConfigs = getConfiguredNetworks();
            if (null != existingConfigs) {
                for (WifiConfiguration existingConfig : existingConfigs) {

                         Log.e(TAG, " 获取配置过的WIFI信息--通过热点名获取热点配置---"+existingConfig);//几秒回调一次

                    if (existingConfig.SSID.equals(ssid)) {
                        return existingConfig;
                    }
                }
            }
            return null;
        }


        /**
         * 获取WIFI的开关状态
         *
         * @return WIFI的可用状态
         */
        public boolean isWifiEnabled() {
            return null != mWifiManager && mWifiManager.isWifiEnabled();
        }

        /**
         * 判断WIFI是否连接
         *
         * @return 是否连接
         */
        boolean isWifiConnected() {
            if (null != mConnectivityManager) {
                NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
                return null != networkInfo && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
            }
            return false;
        }

        /**
         * 判断设备是否有网
         *
         * @return 网络状态
         */
        boolean hasNetwork() {
            if (null != mConnectivityManager) {
                NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
                return networkInfo != null && networkInfo.isAvailable();
            }
            return false;
        }

        /**
         * 获取当前正在连接的WIFI信息
         *
         * @return 当前正在连接的WIFI信息
         */
        public WifiInfo getConnectionInfo() {
            if (null != mWifiManager) {
                return mWifiManager.getConnectionInfo();
            }
            return null;
        }

        /**
         * 扫描附近的WIFI
         */
        public void startScan() {
            if (null != mWifiManager) {
                mWifiManager.startScan();
            }
        }

        /**
         * 获取最近扫描的WIFI热点
         *
         * @return WIFI热点列表
         */
        public List<ScanResult> getScanResults() {
            // 得到扫描结果
            if (null != mWifiManager) {
                return mWifiManager.getScanResults();
            }
            return null;
        }

        /**
         * 排除重复
         *
         * @param scanResults 带处理的数据
         * @return 去重数据
         */
        public static ArrayList<ScanResult> excludeRepetition(List<ScanResult> scanResults) {
            HashMap<String, ScanResult> hashMap = new HashMap<>();

            for (ScanResult scanResult : scanResults) {
                String ssid = scanResult.SSID;

                if (TextUtils.isEmpty(ssid)) {
                    continue;
                }

                ScanResult tempResult = hashMap.get(ssid);
                if (null == tempResult) {
                    hashMap.put(ssid, scanResult);
                    continue;
                }

                if (WifiManager.calculateSignalLevel(tempResult.level, 100) < WifiManager.calculateSignalLevel(scanResult.level, 100)) {
                    hashMap.put(ssid, scanResult);
                }
            }

            ArrayList<ScanResult> results = new ArrayList<>();
            for (Map.Entry<String, ScanResult> entry : hashMap.entrySet()) {
                results.add(entry.getValue());
            }

            return results;
        }

        /**
         * 获取配置过的WIFI信息
         *
         * @return 配置信息
         */
        private List<WifiConfiguration> getConfiguredNetworks() {
            if (null != mWifiManager) {
             return mWifiManager.getConfiguredNetworks();
            }
            return null;
        }

        /**
         * 保持配置
         *
         * @return 保持是否成功
         */
        boolean saveConfiguration() {
            return null != mWifiManager && mWifiManager.saveConfiguration();
        }

        /**
         * 连接到网络
         *
         * @param networkId NetworkId
         * @return 连接结果
         */
        boolean enableNetwork(int networkId) {
            if (null != mWifiManager) {
                boolean isDisconnect = disconnectCurrentWifi();
                boolean isEnableNetwork = mWifiManager.enableNetwork(networkId, true);
                boolean isSave = mWifiManager.saveConfiguration();
                boolean isReconnect = mWifiManager.reconnect();
                return isDisconnect && isEnableNetwork && isSave && isReconnect;
            }
            return false;
        }

        /**
         * 添加网络配置
         *
         * @param wifiConfig 配置信息
         * @return NetworkId
         */
        private int addNetwork(WifiConfiguration wifiConfig) {
            if (null != mWifiManager) {
                int networkId = mWifiManager.addNetwork(wifiConfig);
                if (-1 != networkId) {
                    boolean isSave = mWifiManager.saveConfiguration();
                    if (isSave) {
                        return networkId;
                    }
                }
            }
            return -1;
        }

        /**
         * 更新网络配置
         *
         * @param wifiConfig 配置信息
         * @return NetworkId
         */
        private int updateNetwork(WifiConfiguration wifiConfig) {
            if (null != mWifiManager) {
                int networkId = mWifiManager.updateNetwork(wifiConfig);
                if (-1 != networkId) {
                    boolean isSave = mWifiManager.saveConfiguration();
                    if (isSave) {
                        return networkId;
                    }
                }
            }
            return -1;
        }

        /**
         * 断开指定 WIFI
         *
         * @param netId netId
         * @return 是否断开
         */
        public boolean disconnectWifi(int netId) {
            if (null != mWifiManager) {
                //禁用网络
                boolean isDisable = mWifiManager.disableNetwork(netId);
                boolean isDisconnect = mWifiManager.disconnect();
                return isDisable && isDisconnect;
            }
            return false;
        }

        public static boolean disconnectFromWifi() {
            boolean discont = false;
            if(null!=mWifiManager) {
                discont = mWifiManager.disconnect();
            }
            return discont;
        }


        /**
         * 断开当前的WIFI
         *
         * @return 是否断开成功
         */
        public boolean disconnectCurrentWifi() {
            WifiInfo wifiInfo = getConnectionInfo();
            if (null != wifiInfo) {
                int networkId = wifiInfo.getNetworkId();
                return disconnectWifi(networkId);
            } else {
                // 断开状态
                return true;
            }
        }






        /**
         * 删除配置----------------->取消保存操作
         *
         * @param netId netId
         * @return 是否删除成功
         */
        public boolean deleteConfig(int netId) {
            if (null != mWifiManager) {
                boolean isDisable = mWifiManager.disableNetwork(netId);
                boolean isRemove = mWifiManager.removeNetwork(netId);
                boolean isSave = mWifiManager.saveConfiguration();
                return isDisable && isRemove && isSave;
            }
            return false;
        }

        /**
         * 计算WIFI信号强度
         *
         * @param rssi WIFI信号
         * @return 强度
         */
        public int calculateSignalLevel(int rssi) {
            return WifiManager.calculateSignalLevel(rssi, 5);
        }

        /**
         * 获取WIFI的加密方式
         *
         * @param scanResult WIFI信息
         * @return 加密方式
         */
        public SecurityModeEnum getSecurityModeStr(String capabilities) {
            if (capabilities.contains("WPA")||capabilities.contains("WPA-PSK")|| capabilities.contains("WPA2") || capabilities.contains("WPA2-PSK")|| capabilities.contains("WPS")) {
                return SecurityModeEnum.WPA;
            } else if (capabilities.contains("WEP")) {
                return SecurityModeEnum.WEP;
                //        } else if (capabilities.contains("EAP")) {
                //            return SecurityMode.WEP;
            } else {
                // 没有加密
                return SecurityModeEnum.OPEN;
            }

        }



        /**
         * 添加双引号
         *
         * @param text 待处理字符串
         * @return 处理后字符串
         */
        public String addDoubleQuotation(String text) {
            if (TextUtils.isEmpty(text)) {
                return "";
            }
            return "\"" + text + "\"";
        }
    //=====================新增如下:===============================




    /**
    * 得到当前连接的WiFi  SSID
    *
    * @return
    */
  public String getCurrentWifiSSID() {
      String ssid = mWifiManager.getConnectionInfo().getSSID();
      if (ssid.substring(0, 1).equals("\"")
              && ssid.substring(ssid.length() - 1).equals("\"")) {
          ssid = ssid.substring(1, ssid.length() - 1);
      }

      return trimSSID(ssid);
   }

        /**
         * 获取到的wifi名称前后可能带有引号
         *
         * @param ssid
         * @return
         */
        public String trimSSID(String ssid) {
            if (ssid.substring(0, 1).equals("\"")
                    && ssid.substring(ssid.length() - 1).equals("\"")) {
                ssid = ssid.substring(1, ssid.length() - 1);
            }
            return ssid;
        }



        /**
         * 获取WIFI的加密方式
         * 安全模式:WPA WPA2
         *
         * @return 加密方式
         */
        public SecurityModeEnum getSecurityMode( WifiBean bean) {
            String capabilities = bean.getCapabilities();

            if (capabilities.contains("WPA")||capabilities.contains("WPA-PSK")|| capabilities.contains("WPA2") || capabilities.contains("WPA2-PSK")|| capabilities.contains("WPS")) {
                return SecurityModeEnum.WPA;
            } else if (capabilities.contains("WEP")) {
                return SecurityModeEnum.WEP;
                //        } else if (capabilities.contains("EAP")) {
                //            return SecurityMode.WEP;
            } else {
                // 没有加密
                return SecurityModeEnum.OPEN;
            }
        }



    /**
     * 过滤扫描wifi名称为空的数据
     * @param scanResults
     * @return
     */
    public List<WifiBean> filterWifiNameIsEmpty(List<ScanResult> scanResults) {
        ArrayList<ScanResult> scanNewResults = excludeRepetition(scanResults);
        mNewWifiLists.clear();
        if (!CollectionUtils.isNullOrEmpty(scanNewResults)) {
            for (int i = 0; i < scanNewResults.size(); i++) {
                ScanResult scanResult = scanNewResults.get(i);
                WifiBean wifiBean = new WifiBean();
                wifiBean.setWifiName(ConverFromGBKToUTF8.unicodeToUtf8(scanResult.SSID));
               // wifiBean.setWifiName(ConverFromGBKToUTF8.getUTF8StringFromGBKString(scanResult.SSID));
                wifiBean.setMacAddress(scanResult.BSSID);
                wifiBean.setLevel(String.valueOf(scanResult.level));
                wifiBean.setState(AppConstants.WIFI_STATE_UNCONNECT);   //只要获取都假设设置成未连接,真正的状态都通过广播来确定
                wifiBean.setCapabilities(scanResult.capabilities);
                wifiBean.setScanResult(scanResult);
                mNewWifiLists.add(wifiBean);
            }
        }
        return mNewWifiLists;
    }

        /**
         * 连接wifi时状态发生变化
         * @param wifiName  连接wifi ssid
         * @param type   0 未连接  1 连接成功  2正在连接中
         * @return
         */
        public List<WifiBean> changeStateWhenWifiIsConnected(String wifiName, int type) {
          //  Log.e(TAG, "wifi 列表发生设置新数据 -----");//几秒回调一次
            int index = -1;
            WifiBean wifiInfo = new WifiBean();
            if(mNewWifiLists!=null && mNewWifiLists.size()>0){
                Collections.sort(mNewWifiLists);//根据信号强度排序
                for (int i = 0; i < mNewWifiLists.size(); i++) {

                    WifiBean wifiBean = mNewWifiLists.get(i);
                    if (index == -1 && ("\"" + wifiBean.getWifiName() + "\"").equals(wifiName)) {
                        index = i;

                        wifiInfo.setWifiName(wifiBean.getWifiName());
                        wifiInfo.setMacAddress(wifiBean.getMacAddress());
                        wifiInfo.setLevel(wifiBean.getLevel());
                        if (type == 1) {//已经连接
                            wifiInfo.setState(AppConstants.WIFI_STATE_CONNECT);
                        } else if (type == 2){//正在连接
                            wifiInfo.setState(AppConstants.WIFI_STATE_ON_CONNECTING);
                        }else {
                            wifiInfo.setState(AppConstants.WIFI_STATE_UNCONNECT);
                        }
                      wifiInfo.setCapabilities(wifiBean.getCapabilities());
                      wifiInfo.setScanResult(wifiBean.getScanResult());
                    }
                }
                if (index != -1) {
                    mNewWifiLists.remove(index);
                    mNewWifiLists.add(0, wifiInfo);

                }
            }

            return  mNewWifiLists;
        }

    /**
     之前已经连接未曾断开wifi数据
    */
    public List<WifiBean> alreadyConnectedAndNeverDisconnectedWifiData(List<ScanResult> scanResults,String wifiName) {
         int index = -1;
        ArrayList<ScanResult> scanNewResults =excludeRepetition(scanResults);
         if (!CollectionUtils.isNullOrEmpty(scanNewResults)) {
             mNewWifiLists.clear();
            for (int i = 0; i < scanNewResults.size(); i++) {
                 ScanResult scanResult = scanNewResults.get(i);
                WifiBean  wifiBean  = new WifiBean();
                 wifiBean.setWifiName(ConverFromGBKToUTF8.unicodeToUtf8(scanResult.SSID));
                //wifiBean.setWifiName(ConverFromGBKToUTF8.getUTF8StringFromGBKString(scanResult.SSID));
                wifiBean.setMacAddress(scanResult.BSSID);
                wifiBean.setLevel(String.valueOf(scanResult.level));
                if (scanResult.SSID.equals(wifiName)) {
                    index =i;
                    wifiBean.setState(AppConstants.WIFI_STATE_CONNECT);
                 }else{
                  wifiBean.setState(AppConstants.WIFI_STATE_UNCONNECT);
                 }
                 wifiBean.setCapabilities(scanResult.capabilities);
                 wifiBean.setScanResult(scanResult);
                 mNewWifiLists.add(wifiBean);
              }
          //   Log.e("jason","index===="+index);
              if (index != -1) {
                  if(mNewWifiLists!=null){
                      List<WifiBean> arrlist=new ArrayList<WifiBean>();
                      for (int j = 0; j < mNewWifiLists.size(); j++) {
                             if(index ==j){
                                 arrlist.add(0,mNewWifiLists.get(j));
                              }else{
                               arrlist.add(mNewWifiLists.get(j));
                              }
                       }
                     mNewWifiLists.clear();
                     mNewWifiLists.addAll(arrlist);
                  }
              }
            }
        return  mNewWifiLists;
    }



    //=====================================================


}

WiFiManager.java

public class WiFiManager extends BaseWiFiManager {
    private static final String TAG = "jason";
    private static WiFiManager mWiFiManager;
    private WiFiManager(Context context) {
        super(context);
    }

    public static WiFiManager getInstance(Context context) {
        if (null == mWiFiManager) {
            synchronized (WiFiManager.class) {
                if (null == mWiFiManager) {
                    mWiFiManager = new WiFiManager(context);
                }
            }
        }
        return mWiFiManager;
    }

    /**
     * 打开Wifi
     */
    public void openWiFi() {
        if (!isWifiEnabled() && null != mWifiManager) {
            mWifiManager.setWifiEnabled(true);
        }
    }

    /**
     * 关闭Wifi
     */
    public void closeWiFi() {
        if (isWifiEnabled() && null != mWifiManager) {
            mWifiManager.setWifiEnabled(false);
        }
    }

    /**
     * 连接到开放网络
     *
     * @param ssid 热点名
     * @return 配置是否成功
     */
    public boolean connectOpenNetwork( String ssid) {
        // 获取networkId
        int networkId = setOpenNetwork(ssid);
        if (-1 != networkId) {
            // 保存配置
            boolean isSave = saveConfiguration();
            // 连接网络
            boolean isEnable = enableNetwork(networkId);

            return isSave && isEnable;
        }
        return false;
    }

    /**
     * 连接到WEP网络
     *
     * @param ssid     热点名
     * @param password 密码
     * @return 配置是否成功
     */
    public boolean connectWEPNetwork( String ssid,  String password) {
        // 获取networkId
        int networkId = setWEPNetwork(ssid, password);
        if (-1 != networkId) {
            // 保存配置
            boolean isSave = saveConfiguration();
            // 连接网络
            boolean isEnable = enableNetwork(networkId);

            return isSave && isEnable;
        }
        return false;
    }

    public static  class NetworkBroadcastReceiver extends BroadcastReceiver {


        private static final String TAG = "jason";
        @SuppressLint({"MissingPermission", "LongLogTag"})
        @Override
        public void onReceive(Context context, Intent intent) {
           // Log.e("jason", "onReceive: 开始执行======================");
            WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);

            switch (intent.getAction()) {
                case WifiManager.WIFI_STATE_CHANGED_ACTION: // WIFI状态发生变化
                    /**
                     * WifiManager.WIFI_STATE_CHANGED_ACTION
                     * 解释: WIFI 开关(是否可用)状态广播
                     * 状态相关类: WifiManager
                     *
                     * 状态如下:
                     *
                     * WIFI_STATE_DISABLED: WIFI功能已经被关闭
                     * WIFI_STATE_DISABLING: WIFI功能关闭中,处于此状态WIFI不可以用
                     * WIFI_STATE_ENABLED: WIFI功能已经被打开
                     * WIFI_STATE_ENABLING: WIFI功能正在打开中,处于此状态WIFI可用
                     * WIFI_STATE_UNKNOWN: WIFI功能状态不可知
                     *
                     */
                    switch (intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)) {
                        case WifiManager.WIFI_STATE_ENABLING:
                           // Log.e(TAG, "onReceive: 正在打开 WIFI...");
                            break;
                        case WifiManager.WIFI_STATE_ENABLED:
                           // Log.e(TAG, "onReceive: WIFI 已打开");
                            if (null != mOnWifiEnabledListener) {
                                mOnWifiEnabledListener.onWifiEnabled(true);
                                //  mCallBackHandler.sendEmptyMessage(WIFI_STATE_ENABLED);
                            }
                            break;
                        case WifiManager.WIFI_STATE_DISABLING:
                           // Log.e(TAG, "onReceive: 正在关闭 WIFI...");
                            break;
                        case WifiManager.WIFI_STATE_DISABLED:
                          //  Log.e(TAG, "onReceive: WIFI 已关闭");
                            if (null != mOnWifiEnabledListener) {
                                mOnWifiEnabledListener.onWifiEnabled(false);
                            }
                            break;
                        case WifiManager.WIFI_STATE_UNKNOWN:
                        default:
                           // Log.e(TAG, "onReceive: WIFI 状态未知!");
                            break;
                    }
                    break;
                case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION: // WIFI扫描完成
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        boolean isUpdated = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
                      //  Log.e("AA", "onReceive: WIFI扫描  " + (isUpdated ? "完成" : "未完成"));
                    } else {
                       // Log.e("AA", "onReceive: WIFI扫描完成");
                    }
                    if (null != mOnWifiScanResultsListener) {
                        mOnWifiScanResultsListener.onScanResults(wifiManager.getScanResults());
                    }

                    break;
                case WifiManager.NETWORK_STATE_CHANGED_ACTION: // 网络状态变化广播
                    /**
                     * WifiManager.NETWORK_STATE_CHANGED_ACTION
                     * 解释: 网络状态变化广播
                     * 状态相关类: NetworkInfo
                     *
                     * 1)通用状态(State):
                     *
                     * CONNECTING: 正在连接网络;
                     * CONNECTED: 网络连接成功;
                     * SUSPENDED: 网络暂停;
                     * DISCONNECTING: 正在断开连接;
                     * DISCONNECTED: 连接已断开;
                     * UNKNOWN: 未知状态;
                     * 2)详细状态(DetailedState):
                     *
                     * IDLE: 准备开始数据连接设置;
                     * SCANNING:正在搜索可用网络;
                     * CONNECTING: 正在建立数据连接;
                     * AUTHENTICATING: 网络连接建立,执行身份认证;
                     * OBTAINING_IPADDR: 等待DHCP服务器的相应以分配IP地址信息;
                     * CONNECTED: 此时IP流量应该是可用的;
                     * SUSPENDED: IP流量暂停
                     * DISCONNECTING: 当前正在断开数据连接;
                     * DISCONNECTED: 网络连接已断开,IP流量不可用;
                     * FAILED:尝试连接失败;
                     * BLOCKED: 禁止访问此网络;
                     * VERIFYING_POOR_LINK: 链接连接不良;
                     * CAPTIVE_PORTAL_CHECK: 检查网络是否是强制网络门户;
                     *

                     */

//                   Log.e(TAG, "onReceive: WIFI连接状态发生改变");
//                    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
//                    if (null != networkInfo && ConnectivityManager.TYPE_WIFI == networkInfo.getType()) {
//                    }
                    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                    if(networkInfo.getState()==NetworkInfo.State.CONNECTING ){//正在连接网络;
                      //  Log.e(TAG, "onReceive: 正在连接网络" );
//                    WifiInfo connectingInfo = wifiManager.getConnectionInfo();
//                    if (null != mOnWifiScanResultsListener) {
//                        Log.e(TAG, " SUPPLICANT_STATE_CHANGED_ACTION   获取连接状态{" + connectingInfo.toString());
//
//                        Log.e(TAG, "onWifiIsConnecting    正在连接中---------------------------------");
//                       mOnWifiConnectListener.onWifiIsConnecting(connectingInfo.getSSID(),2);
//                    }
                    }else if(networkInfo.getState()==NetworkInfo.State.DISCONNECTED ){//连接已断开
                      //  Log.e(TAG, "onReceive: 连接已断开" );
                    }else if(networkInfo.getState()==NetworkInfo.State.CONNECTED ){// 网络连接成功
                       // Log.e(TAG, "onReceive: 网络连接成功" );
                    }
                    WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
                    if (null != wifiInfo && wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
                        String ssid = wifiInfo.getSSID();
                       // Log.e(TAG, "onReceive: 网络连接成功 ssid = " + ssid);
                        if (null != mOnWifiConnectListener) {
                            mOnWifiConnectListener.onWiFiConnectSuccess(ssid,1);
                        //    Log.e(TAG, "onWiFiConnectSuccess      wifi 已经连接成功---------------------------------");
                        }
                    }
                    break;
                case WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION:
                    boolean isConnected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
                   // Log.e(TAG, "onReceive: SUPPLICANT_CONNECTION_CHANGE_ACTION  isConnected = " + isConnected);
                    break;
                case WifiManager.SUPPLICANT_STATE_CHANGED_ACTION: // WIFI连接请求状态发生改变
                    /**  WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
                     * 解释: 建立与Access Point的连接状态变化广播
                     * 状态标注类: SupplicantState
                     */
                    // 获取连接状态
                    SupplicantState supplicantState = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
                    int supl_error = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
                    WifiInfo connectionSupplicantState = wifiManager.getConnectionInfo();
                    if (null != mOnWifiScanResultsListener) {
                      //  Log.e(TAG, " SUPPLICANT_STATE_CHANGED_ACTION   获取连接状态{" + supplicantState.toString());
                        //mOnWifiConnectListener.onWiFiConnectLog(supplicantState.toString());

                        mOnWifiConnectListener.onWifiIsConnecting(connectionSupplicantState.getSSID(),2);
                    }

                    switch (supplicantState) {
                        case INTERFACE_DISABLED: // 接口禁用
                            //INTERFACE_DISABLED: 禁用网络接口时进入此状态,wpa_supplication拒绝任何使用无线的操作;
                          //  Log.e(TAG, "onReceive: INTERFACE_DISABLED 接口禁用");
                            break;
                        case DISCONNECTED:// 断开连接
                            //DISCONNECTED: 客户端未连接AP,但是正在搜索一个AP,如连接丢失时触发;
                          //  Log.e(TAG, "onReceive: DISCONNECTED: 断开连接");
                            WifiInfo connectFailureInfo = wifiManager.getConnectionInfo();
                            if(supplicantState == SupplicantState.DISCONNECTED &&supl_error == WifiManager.ERROR_AUTHENTICATING){

                                if (null != mOnWifiScanResultsListener) {
                                    if(AppConstants.isPasswordError==0) {
                                      //  Log.e(TAG, "onWiFiConnectAuthenticatingError  密码错误-if---isPasswordError"+AppConstants.isPasswordError);
                                        mOnWifiConnectListener.onWiFiConnectAuthenticatingError(supl_error, connectionSupplicantState.getSSID(), 0);
                                        AppConstants.isPasswordError= 1;
                                      //  Log.e(TAG, "onWiFiConnectAuthenticatingError  密码错误--------------------------------- " +  AppConstants.isPasswordError);
                                        List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
                                        if (null != configuredNetworks) {
                                            for (WifiConfiguration existingConfig : configuredNetworks) {
                                                if (existingConfig.SSID.equals(connectFailureInfo.getSSID())) {
                                                    boolean isDisable = mWifiManager.disableNetwork(existingConfig.networkId);
                                                    boolean isRemove = mWifiManager.removeNetwork(existingConfig.networkId);
                                                    boolean isSave = mWifiManager.saveConfiguration();
                                                    if(isDisable && isRemove && isSave){
                                                        AppConstants.isPasswordError=0;
                                                     //   Log.e(TAG, "onWiFiConnectAuthenticatingError  密码错误--------------------保存的网络已经移除------------- " +  AppConstants.isPasswordError);

                                                    }
                                                }
                                            }
                                        }
                                    }

                                }

                            }else {

                                if (null != connectFailureInfo) {
                                    if (null != mOnWifiScanResultsListener) {

                                        Log.e(TAG, "onWiFiConnectFailure  其它错误-if---isPasswordError" + AppConstants.isPasswordError);
                                        mOnWifiConnectListener.onWiFiConnectFailure(connectionSupplicantState.getSSID(), 0);

                                        //Log.e(TAG, "onWiFiConnectFailure  其它错误--------------------------------- " + AppConstants.isPasswordError);


                                    }
                                }
                            }
                            break;
                        case INACTIVE: // 不活跃的
                            // INACTIVE WIFI配置中没有启用的网络时进入此状态,同时没有和任何网络尝试连接,需要外部交互来建立连接;
                            WifiInfo connectInactiveInfo = wifiManager.getConnectionInfo();
                           // Log.e(TAG, "onReceive: INACTIVE 不活跃的  connectFailureInfo = " + connectInactiveInfo);
                            if (null != connectInactiveInfo) {
                                if (null != mOnWifiScanResultsListener) {
                                    mOnWifiConnectListener.onWiFiConnectFailure(connectInactiveInfo.getSSID(), 0);
                                }
                                // 断开连接
                                int networkId = connectInactiveInfo.getNetworkId();
                                boolean isDisable = wifiManager.disableNetwork(networkId);
                                boolean isDisconnect = wifiManager.disconnect();
                             //   Log.e(TAG, "onReceive: 断开连接  =  " + (isDisable && isDisconnect));
                            }
                            break;
                        case SCANNING: // 正在扫描
                            //SCANNING: 正在扫描网络;
                           // Log.e(TAG, "onReceive: SCANNING 正在扫描");
                            break;
                        case AUTHENTICATING: // 正在验证
                            //AUTHENTICATING: 发现合适网络,尝试与此网络进行认证时进入此状态,与网络驱动相关;
                          //  Log.e(TAG, "onReceive: AUTHENTICATING: // 正在验证");
                            break;
                        case ASSOCIATING: // 正在关联
                            //ASSOCIATING: 尝试与SSID对应的AP进行关联,与网络驱动相关;
                          //  Log.e(TAG, "onReceive: ASSOCIATING: // 正在关联");
                            break;
                        case ASSOCIATED: // 已经关联
                            //ASSOCIATED: 当网络驱动已经返回与AP的关联成功时进入此状态,如果使用的是IEEE 802.1X模式,
                            // 会等到起身份认证成功后进入此状态;
                           // Log.e(TAG, "onReceive: ASSOCIATED: // 已经关联");
                            break;
                        case FOUR_WAY_HANDSHAKE:
                            //FOUR_WAY_HANDSHAKE 当WPA/WPA2 四次握手启动时进入此状态,如果是WPA-PSK情况下,关联成功后接收到第一个EAPOL-Key帧时会直接进入此状态。在WPA-EAP的情况下,

                          //  Log.e(TAG, "onReceive: FOUR_WAY_HANDSHAKE://四次握手");
                            break;
                        case GROUP_HANDSHAKE:
                            //GROUP_HANDSHAKE 四次握手完成,当请求者开始接收消失时,进入此状态;
                         //   Log.e(TAG, "onReceive: GROUP_HANDSHAKE: //集体握手");
                            break;
                        case COMPLETED: // 完成
                            //COMPLETED 所有认证已经完成进入状态,此时可能没有分配任何IP,需要发送DHCP请求来获取地址;
                          //  Log.e(TAG, "onReceive: WIFI_CONNECT_SUCCESS: wifi 已经连接成功// 完成");
//                        WifiInfo connectSuccessInfo = wifiManager.getConnectionInfo();
//
//                        if (null != connectSuccessInfo) {
//                            if (null != mOnWifiConnectListener) {
//                                mOnWifiConnectListener.onWiFiConnectSuccess(connectSuccessInfo.getSSID(),1);
//                                Log.e(TAG, "onReceive: WIFI_CONNECT_SUCCESS: wifi 已经连接成功// 完成");
//                            }
//                        }
                            break;
                        case DORMANT:
                            //DORMANT:用户明确发出中断指令时进入状态;
                          //  Log.e(TAG, "onReceive: DORMANT:用户明确发出中断指令时进入状态;");
                            break;
                        case UNINITIALIZED: // 未初始化
                            //UNINITIALIZED: 没有连接wpa_supplicant,是一个伪状态;
                          //  Log.e(TAG, "onReceive: UNINITIALIZED: // 未初始化");
                            break;
                        case INVALID: // 无效的
                            //INVALID: 伪状态,一般不会出现;
                           // Log.e(TAG, "onReceive: INVALID: // 无效的");
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }

        }
   }



    /**
     * 连接到WPA2网络
     *
     * @param ssid     热点名
     * @param password 密码
     * @return 配置是否成功
     */
    public boolean connectWPA2Network( String ssid,  String password) {
        // 获取networkId
        int networkId = setWPA2Network(ssid, password);
        if (-1 != networkId) {
            // 保存配置
            boolean isSave = saveConfiguration();
            // 连接网络
            boolean isEnable = enableNetwork(networkId);

            return isSave && isEnable;
        }
        return false;
    }

    protected static OnWifiEnabledListener mOnWifiEnabledListener;//监听wifi 是否打开的回调

    protected static OnWifiScanResultsListener mOnWifiScanResultsListener;//监听WiFi扫描的回调函数

    protected static OnWifiConnectListener mOnWifiConnectListener;

    public void setOnWifiEnabledListener(OnWifiEnabledListener listener) {
        mOnWifiEnabledListener = listener;
    }

    public void removeOnWifiEnabledListener() {
        mOnWifiEnabledListener = null;
    }

    public void setOnWifiScanResultsListener(OnWifiScanResultsListener listener) {
        mOnWifiScanResultsListener = listener;
    }

    public void removeOnWifiScanResultsListener() {
        mOnWifiScanResultsListener = null;
    }

    public void setOnWifiConnectListener(OnWifiConnectListener listener) {
        mOnWifiConnectListener = listener;
    }

    public void removeOnWifiConnectListener() {
        mOnWifiConnectListener = null;
    }
}

事件回调处理接口

/**
 * WIFI连接的回调接口
 */
public interface OnWifiConnectListener {
    /**
     * WIFI连接中的信息回调
     * @param wifiName  wifi名称
     * @param connectionType  连接类型  0未连接  1连接成功  2正在连接
     */
    void onWifiIsConnecting(String wifiName,int connectionType);


    /**
     * wifi 连接失败
     * @param wifiName
     * @param connectionType
     */
    void onWiFiConnectFailure(String wifiName, int connectionType);

    /**
     * wifi 密码错误
     * @param errorMsg  错误信息 1 密码错误
     * @param wifiName  wifi名称
     * @param connectionType 连接类型  0未连接  1连接成功  2正在连接
     */
    void onWiFiConnectAuthenticatingError(int errorMsg, String wifiName, int connectionType);

    /**
     * WIFI连接成功的回调
     * @param wifiName wifi名称
     * @param connectionType  连接类型  0未连接  1连接成功  2正在连接
     */
    void onWiFiConnectSuccess(String wifiName, int connectionType);
}
/**
 * Created by kqw on 2016/8/4.
 * WIFI打开关闭的回调接口
 */
public interface OnWifiEnabledListener {

    /**
     * WIFI开关的回调
     *
     * @param enabled true 可用 false 不可用
     */
    void onWifiEnabled(boolean enabled);
}

/**
 *
 * WIFI扫描结果的回调接口
 */
public interface OnWifiScanResultsListener {

    /**
     * 扫描结果的回调
     *
     * @param scanResults 扫描结果
     */
    void onScanResults(List<ScanResult> scanResults);

}

WifiBean .java 封装wifi数据

import android.net.wifi.ScanResult;
import android.os.Parcel;
import android.os.Parcelable;


public class WifiBean implements Comparable<WifiBean>, Parcelable {
    private static final long serialVersionUID = -7060210544600464481L;

    private String wifiName;
    private String macAddress;
    private String level;
    private String state;  //已连接  正在连接  未连接 三种状态
    private String capabilities;//加密方式

    private ScanResult scanResult;//原生的对象ScanResult

    public String getCapabilities() {
        return capabilities;
    }

    public void setCapabilities(String capabilities) {
        this.capabilities = capabilities;
    }

    public String getWifiName() {
        return wifiName;
    }

    public void setWifiName(String wifiName) {
        this.wifiName = wifiName;
    }
    public String getMacAddress() {
        return macAddress;
    }

    public void setMacAddress(String macAddress) {
        this.macAddress = macAddress;
    }
    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public int compareTo(WifiBean o) {
        int level1 = Integer.parseInt(getLevel());
        int level2 = Integer.parseInt(o.getLevel());
        if (level1 > level2) {//降序
            return -1;
        } else if (level1 == level2) {
            return 0;
        } else {
            return 1;
        }
    }

    @Override
    public String toString() {

//        return "自定义WifiBean{" +
//                "wifiName='" + wifiName + '\'' +
//                ", state='" + state + '\'' +
//                ", level='" + level + '\'' +
//                ", capabilities='" + capabilities + '\'' +
//                ",\n 扫描点scanResult=" + scanResult +
//                '}';
        return "自定义WifiBean{" +
                "macAddress='" + macAddress + '\'' +
                "wifiName='" + wifiName + '\'' +
                ", level='" + level + '\'' +
                ", state='" + state + '\'' +
                ", capabilities='" + capabilities + '\'' +
                ",\n 扫描点scanResult=" + scanResult +
                '}';
    }

    public ScanResult getScanResult() {
        return scanResult;
    }

    public void setScanResult(ScanResult scanResult) {
        this.scanResult = scanResult;
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(wifiName);
        dest.writeString(macAddress);
        dest.writeString(level);
        dest.writeString(state);
        dest.writeString(capabilities);
        dest.writeValue(scanResult);

    }

    public static final Creator<WifiBean> CREATOR = new Creator<WifiBean>() {

        @Override
        public WifiBean createFromParcel(Parcel source) {

            WifiBean model = new WifiBean();
            model.wifiName = source.readString();
            model.macAddress =source.readString();
            model.level = source.readString();
            model.state = source.readString();
            model.capabilities = source.readString();
            model.scanResult = (ScanResult) source.readValue(ScanResult.class.getClassLoader());
            return model;
        }

        @Override
        public WifiBean[] newArray(int size) {
            return new WifiBean[size];
        }
    };
}

AppActivity.java 调用类



public class AppActivity extends org.qtproject.qt5.android.bindings.QtActivity implements OnWifiScanResultsListener, OnWifiConnectListener, OnWifiEnabledListener
{
     public  String  registerCodeState ="";
 private static final String TAG = "Jason";
    //wifiBeans保存的是连接中状态变化数据
    private List<WifiBean> wifiBeans;
    //存放扫描到wifi列表数据
    private List<WifiBean> mList =new ArrayList<>();;
    private WiFiManager mWiFiManager;

    private NativeTools  mjniTools;
    //wifi 初始化结束

  

    public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
           
              mjniTools  = new  NativeTools();
              mWiFiManager = WiFiManager.getInstance(MyApplication.getContext());
              // 添加监听
              mWiFiManager.setOnWifiEnabledListener(this);
              mWiFiManager.setOnWifiScanResultsListener(this);
              mWiFiManager.setOnWifiConnectListener(this);
    if(wifiBeans!=null ){
               wifiBeans.clear();
              }
              if(mList!=null){
                 mList.clear();
              }
       }

 //======================wifi 操作==========================================
 /**
 打开wifi
 */
 public void openSystemWiFi(){
     mWiFiManager.openWiFi();
  }
/**
  关闭wifi
*/
 public void closeSystemWiFi(){
   mWiFiManager.closeWiFi();
   if(wifiBeans!=null ){
    wifiBeans.clear();
   }
   if(mList!=null){
      mList.clear();
   }
 }

/**
通过定位获附近wifi 数据
                     扫描数据
*/
public  void scanCurrentLocationWifiData(){
   List<ScanResult> scanResults = mWiFiManager.getScanResults();
   initScanDate(scanResults);
}



/**
 获取扫描数据
*/
public  void getScanResult(){
    mWiFiManager.startScan();
}

/**
    * WIFI列表刷新后的回调
    *
    * @param scanResults 扫描结果
    */
   public void onScanResults(List<ScanResult> scanResults) {
       initScanDate(scanResults);

   }
 /**
   * WIFI连接中的信息回调
   * @param wifiName  wifi名称
   * @param connectionType  连接类型  0未连接  1连接成功  2正在连接
   */

  public void onWifiIsConnecting(String wifiName, int connectionType) {
          wifiBeans = mWiFiManager.changeStateWhenWifiIsConnected(wifiName, connectionType);
          updteConnectStatechangeList(wifiBeans);
          if(registerCodeState.equals("1")){
          mjniTools.GetQtWifiChanges("正在连接");


          }


  }
/**
    * wifi 连接失败
    * @param wifiName
    * @param connectionType
    */

  public void onWiFiConnectFailure(String wifiName, int connectionType) {
          wifiBeans = mWiFiManager.changeStateWhenWifiIsConnected(wifiName, connectionType);
          updteConnectStatechangeList(wifiBeans);
           if(registerCodeState.equals("1")){
            mjniTools.GetQtWifiChanges("连接失败");
            }


  }
  /**
     * wifi 密码错误
     * @param errorMsg  错误信息 1 密码错误
     * @param wifiName  wifi名称
     * @param connectionType 连接类型  0未连接  1连接成功  2正在连接
     */

  public void onWiFiConnectAuthenticatingError(int errorMsg, String wifiName, int connectionType) {
      if(errorMsg==1) {
              wifiBeans = mWiFiManager.changeStateWhenWifiIsConnected(wifiName, connectionType);
              updteConnectStatechangeList(wifiBeans);
                if(registerCodeState.equals("1")){
             mjniTools.GetQtWifiChanges("密码错误");

       }

      }

  }

  /**
    * WIFI连接成功的回调
    * @param wifiName wifi名称
    * @param connectionType  连接类型  0未连接  1连接成功  2正在连接
    */

  public void onWiFiConnectSuccess(String SSID, int connectType) {
          wifiBeans = mWiFiManager.changeStateWhenWifiIsConnected(SSID, connectType);
           updteConnectStatechangeList(wifiBeans);
           if(registerCodeState.equals("1")){
            mjniTools.GetQtWifiChanges("连接成功");

            }
  }




/**
    * WIFI开关状态的回调
    *
    * @param enabled true 可用 false 不可用
    */

   public void onWifiEnabled(boolean enabled) {

    Log.e(TAG, "WIFI开关状态的回调enabled=" + enabled);
   }


/**
连接wifi
@param position mList对应的位置
@param wifiName 名称
@param password 密码
*/
public String connectWifi(String capabilities,String wifiName,String password ){
    String iswhetherSucceed="失败";
    boolean whetherSucceed=false;
    Log.e(TAG, "WIFI连接方法  capabilities" + capabilities+";wifiName="+wifiName+";password="+password);
    switch (mWiFiManager.getSecurityModeStr(capabilities)) {
        case WPA:
        case WPA2:
          whetherSucceed = mWiFiManager.connectWPA2Network(wifiName, password);
           break;
        case WEP:
           whetherSucceed= mWiFiManager.connectWEPNetwork(wifiName, password);
           break;
        case OPEN: // 开放网络
           whetherSucceed = mWiFiManager.connectOpenNetwork(wifiName);
            break;
        }
   if(whetherSucceed){
      iswhetherSucceed="成功";
    }else{
      iswhetherSucceed="失败";
    }

   return iswhetherSucceed;
 }



/**
断开wifi
@param position mList对应的位置
*/
public String disconnectWifi(String ssid ){
     String disconnectSuccessfully ="失败";
    WifiInfo connectionInfo = mWiFiManager.getConnectionInfo();
    Log.e(TAG, "onClick: connectionInfo :" + connectionInfo.getSSID());
    if (mWiFiManager.addDoubleQuotation(ssid).equals(connectionInfo.getSSID())) {
       boolean successfully= mWiFiManager.disconnectWifi(connectionInfo.getNetworkId());
        //mWiFiManager.disconnectwifi();
        if(successfully){
            disconnectSuccessfully="断开成功";
        }else{
          disconnectSuccessfully="断开失败";
        }
    }
  return disconnectSuccessfully;
}
/**
取消保存配置

*/
public String removeWifi(String ssid){
    String removedSuccessfully ="没有保存";
    WifiConfiguration wifiConfiguration = mWiFiManager.getConfigFromConfiguredNetworksBySsid(ssid);
    if (null != wifiConfiguration) {
      boolean isDelete = mWiFiManager.deleteConfig(wifiConfiguration.networkId);
          if(isDelete){
             removedSuccessfully  =  "删除成功";
           }else{
              removedSuccessfully  = "删除失败";
           }
     } else {
        removedSuccessfully  = "没有保存";
      }
     return removedSuccessfully;
}
/**
   通过定位获附近wifi 数据 scanCurrentLocationWifiData()
   手动触发扫描 onScanResults()
*/
private void  initScanDate(List<ScanResult> scanResults) {
        if(scanResults != null && scanResults.size() >= 0 ) {
//            for(int j=0;j< scanResults.size();j++){
//                Log.e("jason","扫描原始数据="+scanResults.get(j).SSID);
//                }
            String currentWifiSSID = mWiFiManager.getCurrentWifiSSID();
             if(currentWifiSSID.equals("0x")){//当前有wifi连接
                  mList.clear();
                  if(wifiBeans!=null){ wifiBeans.clear();}
                  wifiBeans = mWiFiManager.filterWifiNameIsEmpty(scanResults);
                  mList.addAll(wifiBeans);
                  if(registerCodeState.equals("1")){
                     mjniTools.GetQtScanResults("扫描结束");
                     mjniTools.wifiResultsList(mList);
                   }
              }else{
                    mList.clear();
                    if(wifiBeans!=null){ wifiBeans.clear();}
                    wifiBeans= mWiFiManager.alreadyConnectedAndNeverDisconnectedWifiData(scanResults,currentWifiSSID);
                    if(wifiBeans!=null &&wifiBeans.size()>0){
                    mList.addAll(wifiBeans);
                    if(registerCodeState.equals("1")){
                     mjniTools.GetQtScanResults("扫描结束");
                     mjniTools.wifiResultsList(mList);
                   }
               }
         }
  }
}

/**
  更新wifi连接过程中数据刷新处理
*/
  private void updteConnectStatechangeList(List<WifiBean> wifiBeans) {

          if(wifiBeans!=null &&wifiBeans.size() > 0) {
             mList.clear();
             mList.addAll(wifiBeans);
             if(registerCodeState.equals("1")){
               mjniTools.wifiResultsList(mList);
             }
          }

          //updateArrayStrings();
  }



/***
  updateData 给qt 层调用
*/
public  String[] updateArrayStrings(){
      String[] listk = new String[mList.size()];

      if(mList!=null){
          for( int i=0;i< mList.size();i++){
              WifiBean wifiBean = mList.get(i);
              listk[i] = wifiBean.getWifiName()+";"+wifiBean.getMacAddress()+";"+wifiBean.getLevel()+";"+wifiBean.getState()+";"+wifiBean.getCapabilities();
             //  Log.e(TAG,"updateDatalist转array[]="+listk[i]);
          }
          return listk;
      }
      return listk;
  }
/**
获取wifi开关状态是否可用
0不可用  1 可用
*/
public int getWifiEnabled(){
    int disabling =0;
   boolean isEnabled = mWiFiManager.isWifiEnabled();
   if(isEnabled){//可用
    disabling =1;
   }else{//不可用
     disabling =0;
   }
 return disabling;
}
/**
获取注册状态码 1 成功 0失败
*/

public void getRegisterCode(String code){
   Log.e("jason","getRegisterCode==="+code);
   registerCodeState = code;
    Log.e("jason","getRegisterCode==registerCodeState ="+registerCodeState);

}



/**
得到当前连接的WiFi  SSID
*/
public String  currentConnectionWifiName(){
    String currentWifiSSID = mWiFiManager.getCurrentWifiSSID();
    return  currentWifiSSID;
}


 //===========================wifi end=====================================

 public void onDestroy() {
       super.onDestroy();
         Log.e("jason", "AppUpdateActivity========================= onDestroy");
  
       if( mjniTools!=null){
            mjniTools =null;
           }
       // 移除监听
       if(mWiFiManager!=null){
           Log.e("jason", "onDestroy===移除监听==========mWiFiManager");
       mWiFiManager.removeOnWifiEnabledListener();
       mWiFiManager.removeOnWifiScanResultsListener();
       mWiFiManager.removeOnWifiConnectListener();
       }

   }



};




QT端(C++)的实现

wifiSettingWidget.h

#ifndef WIFISETTINGWIDGET_H
#define WIFISETTINGWIDGET_H
#include <QWidget>
#include <QString>
#include <QList>
#include <QDebug>
#include <QListWidget>
#include <QTimer>
#include "switchcontrol.h"
#include "customglobal.h"
#include <QFont>
#include <QPalette>
#include "QDialogButtonBox"
#include "QVBoxLayout"
#include <QDebug>
#include <QListWidget>
#include <QListWidgetItem>
#include <QList>
#include <QLabel>
#include <QHBoxLayout>
#include "src/myWidget/wifidialog.h"
#include "src/myWidget/loadwidget.h"
#include "src/myWidget/mycustomdialogwifidisconnectiondialog.h"
#include "src/myWidget/mycustomdialog.h"
#ifdef Q_OS_ANDROID
#include <QAndroidJniObject>
#include <QAndroidJniEnvironment>
#include <QtAndroid>
#include "src/myWidget/interface.h"
#endif
namespace Ui {
class wifiSettingWidget;
}
class wifiSettingWidget : public QWidget
{
    Q_OBJECT

public:
    explicit wifiSettingWidget(QWidget *parent = 0);
    ~wifiSettingWidget();
signals:

public:
      void currentOnItemClickListener();
      void getSwitchStatus(bool isChecked);
    void ReturnBackClicked();
    void  initData(QList<WifiInfoBean> mInfos);
    //获取字符串数组(两个方法二选其一)
    void getWifiDataStrings();
    //获取wifi列表对象 (两个方法二选其一)
    void getWifiDataList();
private slots:
 //连接wifi
 void qtConnectwifi(QString capabilities,QString SSID ,QString PWD);
//断开wifi
 void qtDisConnectionWifiCallBack(QString ssid);
 //取消保存wifi
 void qtRemoveWifiCallBack(QString ssid);

 void loadingCompleted();
private:
    Ui::wifiSettingWidget *ui;
        SwitchControl  *control;
    QList<WifiInfoBean> mListInfo;
    Interface *m_interface;
    WifiDialog  *m_dialog;//连接wifi对话框
    QFont ft;
     QPalette pe;
     LoadWidget *m_wifiLoad;
     MyCustomDialog *m_passwordError;
     MyCustomDialogWifiDisconnectionDialog  *m_wifiDisconnectionDialog;
};

#endif // WIFISETTINGWIDGET_H

wifiSettingWidget.cpp

#include "wifisettingwidget.h"
#include "ui_wifisettingwidget.h"
#include "src/myWidget/myprogressbar.h"
#include <QDebug>
#include <QListWidget>
#include <QListWidgetItem>
#include <QString>
#include <QStringList>
#include <QList>
#include "QDebug"
#include <QScroller>
#include <QLabel>
#include <QHBoxLayout>
#include <QSettings>

#ifdef Q_OS_ANDROID
#include <QAndroidJniObject>
#include <QAndroidJniEnvironment>
#include <QtAndroid>

#endif
#include<QMetaType>
/**
 
 wifi setting interface
 * @brief wifiSettingWidget::wifiSettingWidget
 * @param parent
 */
wifiSettingWidget::wifiSettingWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::wifiSettingWidget)
{

    ui->setupUi(this);
    mListInfo.clear();
  connect(ui->mBtnBack, &QPushButton::clicked, this, &wifiSettingWidget::ReturnBackClicked);
  //扫描结果回调
    connect(Interface::instance,&Interface::ScanEndCallbackSignal,this,[=](){
        // getWifiDataStrings();
        qDebug()<<"Jason"<<" 接收到扫描结束的通知============="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz") ;
         getWifiDataList();


    });
    //连接过程中的回调
    connect(Interface::instance,&Interface::NotificationWifiChangesCallbackSignal,this,[=](QString notificationStr){
         if(notificationStr==QString::fromLocal8Bit("正在连接")){
              qDebug()<<"Jason"<<" 正在连接==wifiSettingWidget============="<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz") ;
             //  getWifiDataStrings();
              getWifiDataList();

         } else if(notificationStr==QString::fromLocal8Bit("密码错误")){
             //  getWifiDataStrings();
             getWifiDataList();
              m_passwordError = new MyCustomDialog();
             m_passwordError->move(180,110);
             m_passwordError->setWindowFlag(Qt::FramelessWindowHint);
             m_passwordError->setWindowModality(Qt::ApplicationModal);
             m_passwordError->InitUi(1,false,"","2","");
             m_passwordError->setInfo(QString("温馨提示:"),QString("连接密码错误,请重新连接!"),QPixmap(":/image/hinticon/warn.png"));
             m_passwordError->setAttribute(Qt::WA_DeleteOnClose);
             m_passwordError->show();
        }else if(notificationStr==QString::fromLocal8Bit("连接失败")){
             // getWifiDataStrings();
             getWifiDataList();
        }else if(notificationStr==QString::fromLocal8Bit("连接成功")){
             // getWifiDataStrings();
             getWifiDataList();
        }

    });

    ui->listWidget->setViewMode(QListView::ListMode);//选择列表形式展示
   ui->listWidget->setFlow(QListView::TopToBottom);//选择从上到下的方式拖动
    //屏蔽横向滚动条
    ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    //屏蔽垂直滚动条

    ui->listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->listWidget->setStyleSheet("background-color:transparent");
    //ui->listWidget->update();//刷新界面
    // 像素滚动
    // ui->listWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
   // ui->listWidget->setVerticalScrollMode(QListWidget::ScrollPerPixel);
    ui->listWidget->setHorizontalScrollMode(QListWidget::ScrollPerPixel);
  //  QScroller::grabGesture(ui->listWidget,QScroller::LeftMouseButtonGesture);

    /*用connect 连接信号和槽函数*/
    QObject::connect(ui->listWidget,&QListWidget::itemClicked,this,&wifiSettingWidget::currentOnItemClickListener);

    control= new SwitchControl(this);
    control -> move(130,70);
    //设置状态、样式
    control -> setToggled(false);
    // 可设置槽函数控制按钮的开关状态
    connect(control,&SwitchControl::toggled,this,&wifiSettingWidget::getSwitchStatus);
//    ui->listWidget->setGridSize(QSize(ui->listWidget->width(),55));

   int  qtWifiEnabled = m_interface->getQtWifiEnabled();
       if(qtWifiEnabled==0){
            control -> setToggled(false);
            ui->listWidget->clear();
       }else{
            control -> setToggled(true);


            m_interface =  Interface::getInstance();
            m_interface->startScanningQtWifi();
           QString wifiName = m_interface->getQtCurrentWifiSSID();
            qDebug()<<"jason"<<"wifiSettingWidget="<<"获取当前已经连接wifi名字wifiName="<<wifiName;
                if(wifiName==QString::fromLocal8Bit("0x")){
                m_wifiLoad =new LoadWidget(this);
                m_wifiLoad->move(300,80);
                m_wifiLoad->InitializeControls(true);
                m_wifiLoad->setCurrentIndex(1);
                m_wifiLoad->setWhetherDisplayBackgroundWhileLoading(2);
                m_wifiLoad->setCurrentTotal(30);
                m_wifiLoad->setLoadingType("加载中...");
                m_wifiLoad->setLoadingBoxStyleMode("1");
                m_wifiLoad->setWindowFlag(Qt::FramelessWindowHint);
                m_wifiLoad->setWindowModality(Qt::ApplicationModal);
                m_wifiLoad->setAttribute(Qt::WA_DeleteOnClose);
                connect(m_wifiLoad, &LoadWidget::loadingClick, this , &wifiSettingWidget::loadingCompleted);
                m_wifiLoad->mShow();
           }

      }

}

wifiSettingWidget::~wifiSettingWidget()
{
    delete ui;
}
/**
  获取变化的wifi数据 ----->字符串数组
 * @brief wifiSettingWidget::getWifiDataStrings
 */
void wifiSettingWidget::getWifiDataStrings(){

    mListInfo.clear();
    m_interface =  Interface::getInstance();
     mListInfo = m_interface->getWifiScanResults();
     if(mListInfo.size()!=0 && !mListInfo.isEmpty()){
         initData(mListInfo);
     }

}


/**
  获取变化的wifi数据 ----->字符串数组
 * @brief wifiSettingWidget::getWifiDataList
 */
void wifiSettingWidget::getWifiDataList(){
    mListInfo.clear();
    m_interface =Interface::getInstance();
    mListInfo = m_interface->GetWifiObjectList();
    if(mListInfo.size()!=0 && !mListInfo.isEmpty()){
        initData(mListInfo);
    }
}
/**
 打开wifi 开关按钮
 * @brief MainWindow::getSwitchStatus 获取开关状态
 * @param isChecked  true 打开 false 关闭
 */
void wifiSettingWidget::getSwitchStatus(bool isChecked ){

    if (isChecked) {
        qDebug()<<"jason"<<" 打开= "<<isChecked;
       m_interface= Interface::getInstance();
       m_interface->openQtWifi();
       m_interface->startScanningQtWifi();
       m_wifiLoad =new LoadWidget(this);
       m_wifiLoad->move(300,80);
       m_wifiLoad->InitializeControls(true);
       m_wifiLoad->setCurrentIndex(1);
        m_wifiLoad->setWhetherDisplayBackgroundWhileLoading(2);
       m_wifiLoad->setCurrentTotal(40);
       m_wifiLoad->setLoadingType("加载中...");
       m_wifiLoad->setLoadingBoxStyleMode("1");
       m_wifiLoad->setWindowFlag(Qt::FramelessWindowHint);
       m_wifiLoad->setWindowModality(Qt::ApplicationModal);
       m_wifiLoad->setAttribute(Qt::WA_DeleteOnClose);
       connect(m_wifiLoad, &LoadWidget::loadingClick, this , &wifiSettingWidget::loadingCompleted);
       m_wifiLoad->mShow();

     } else {
       qDebug()<<"jason"<<" 关闭= "<<isChecked;
       m_interface = Interface::getInstance();
       m_interface->closeQtWifi();
       mListInfo.clear();
       ui->listWidget->clear();


    }
}


/**
  listview 点击item 事件

  当前点击QlistWidget 中哪一个条目
 * @brief MainWindow::currentOnItemClickListener
 */
void wifiSettingWidget::currentOnItemClickListener()
{
    //我们也不做过多的操作我们可以获取打印出当前选中的项目的文本数据
    int CurrentRow = ui->listWidget->currentRow();

    if(CurrentRow!=-1)
    {
        ui->listWidget->item(CurrentRow);
        if(mListInfo.at(CurrentRow).state==QString::fromLocal8Bit("未连接")){
                      m_dialog =new WifiDialog(this);
                      m_dialog->move(260,110);
                      m_dialog->setWindowFlag(Qt::FramelessWindowHint);
                      m_dialog->setWindowModality(Qt::ApplicationModal);
                      m_dialog->setAttribute(Qt::WA_DeleteOnClose);
                     // m_dialog->initWifiDialog(mListInfo.at(CurrentRow).SSID,mListInfo.at(CurrentRow).state,CurrentRow);
                       m_dialog->initWifiDialog(mListInfo.at(CurrentRow).keytype,mListInfo.at(CurrentRow).SSID,mListInfo.at(CurrentRow).state);
                         if (QDialogButtonBox *btn_box = m_dialog->findChild<QDialogButtonBox*>() ){
                             //设置button之间的间距
                             btn_box->layout()->setSpacing(50);
                             QString ok_style = "QPushButton{background:rgb(34, 166, 232); color:rgb(255,255,255); border-radius:10px; min-height:60px; min-width:130px; font:36px \"Microsoft YaHei\";}"
                                                   "QPushButton:hover{background:rgb(34, 167, 229);}"
                                                   "QPushButton:pressed{background:rgb(34, 167, 229);}";
                             btn_box->button(QDialogButtonBox::Ok)->setText("连接");
                             btn_box->button(QDialogButtonBox::Ok)->setStyleSheet(ok_style);
                             QString cancel_style = "QPushButton{background:rgb(207, 222, 236); color:rgb(255,255,255); border-radius:10px; min-height:60px; min-width:130px; font:36px \"Microsoft YaHei\";}"
                                                       "QPushButton:hover{background:rgb(207, 222, 236);}"
                                                       "QPushButton:pressed{background:rgb(207, 222, 236);}";
                             btn_box->button(QDialogButtonBox::Cancel)->setText("取消");
                             btn_box->button(QDialogButtonBox::Cancel)->setStyleSheet(cancel_style);
                         }



                         QString style = "QLineEdit{border:2px solid rgb(34, 166, 232);padding-left:15px;border-radius:10px;color:rgb(34, 166, 232);font:22px \"Microsoft YaHei\";}"
                                         "QLineEdit:focus{border:2px solid rgb(34, 166, 232);}"
                                         "QLineEdit:disabled{background-color:rgb(255,255,255);}"
                                         "QLabel{color:rgb(34, 167, 229); font:24px \"Microsoft YaHei\"; font-weight:bold;}";
                      m_dialog->setStyleSheet(style);
                      //连接wifi 刷新连接状态
                      connect(m_dialog, &WifiDialog::connectCurrentWifi, this , &wifiSettingWidget::qtConnectwifi);
                      m_dialog->show();
        }else if(mListInfo.at(CurrentRow).state==QString::fromLocal8Bit("已连接")){
            m_wifiDisconnectionDialog =new MyCustomDialogWifiDisconnectionDialog();
            m_wifiDisconnectionDialog->move(180,110);
            m_wifiDisconnectionDialog->setWindowFlag(Qt::FramelessWindowHint);
            m_wifiDisconnectionDialog->setWindowModality(Qt::ApplicationModal);
            m_wifiDisconnectionDialog->InitUi(3,false,"取消保存","断开");
            m_wifiDisconnectionDialog->setInfo(mListInfo.at(CurrentRow).SSID,mListInfo.at(CurrentRow).state);
            m_wifiDisconnectionDialog->setAttribute(Qt::WA_DeleteOnClose);
            connect(m_wifiDisconnectionDialog, &MyCustomDialogWifiDisconnectionDialog::disconnectCallbcak, this , &wifiSettingWidget::qtDisConnectionWifiCallBack);
             //删除wifi
            connect(m_wifiDisconnectionDialog, &MyCustomDialogWifiDisconnectionDialog::cancelSaveCallback, this , &wifiSettingWidget::qtRemoveWifiCallBack);
            m_wifiDisconnectionDialog->show();
        }


    }
}
/**
  连接wifi
 * @brief wifiSettingWidget::qtConnectwifi
 * @param SSID
 * @param PWD
 * @param capabilities
 */
void wifiSettingWidget:: qtConnectwifi(QString capabilities,QString SSID ,QString PWD){
    m_interface = Interface::getInstance();
    m_interface->connectQtWifi(capabilities,SSID,PWD);
//    if(mListInfo.size()>0){
//       mListInfo.clear();
//    }
//     ui->listWidget->clear();
}
/**
  断开连接
 * @brief wifiSettingWidget::qtDisConnectionWifiCallBack
 * @param position
 */
void wifiSettingWidget::qtDisConnectionWifiCallBack(QString ssid){
     m_interface = Interface::getInstance();
     m_interface->disConnectionQtWifi(ssid);
//     if(mListInfo.size()>0){
//         mListInfo.clear();
//     }
//      ui->listWidget->clear();
}
/**
  删除保存wifi
 * @brief wifiSettingWidget::qtRemoveWifiCallBack
 * @param position
 */
void wifiSettingWidget::qtRemoveWifiCallBack(QString ssid)
{

    m_interface = Interface::getInstance();
    m_interface->removeQtWifi(ssid);
//    if(mListInfo.size()>0){
//        mListInfo.clear();
//    }
//    ui->listWidget->clear();
}
/**
  加载完成
 * @brief wifiSettingWidget::loadingCompleted
 */
void wifiSettingWidget::loadingCompleted()
{
    m_wifiLoad->mClose();
//    m_interface =  Interface::getInstance();
//    m_interface->startScanningQtWifi();
    initData(mListInfo);

}



/**
  返回按钮
 * @brief wifiSettingWidget::on_pushButton_clicked
 */
void wifiSettingWidget::ReturnBackClicked()
{

    this->close();
}
/**
  初始化数据
 * @brief wifiSettingWidget::initData
 * @param mInfos
 */
void wifiSettingWidget::initData(QList<WifiInfoBean> mInfos)
{
    ui->listWidget->clear();
    if(mInfos.size()!=0 && !mInfos.isEmpty()){
        for (int j =0;j<mInfos.size();j++) {

            QWidget *widget = new QWidget(ui->listWidget);

            //创建自定义的item
            widget->setStyleSheet("background:transparent;");
             //设置图片icon
            QLabel *imageIcon = new QLabel(widget);
            QPixmap myPix(":/image/wifi/wifiicon.png");
            imageIcon->setFixedSize(70, 42);

            imageIcon->setPixmap(myPix);
            imageIcon->setScaledContents(true);
            imageIcon->setStyleSheet("QLabel{padding-left:15px;padding-right:15px;}");


            QWidget *frontArea = new QWidget(widget);
            //设置固定高度
            frontArea->setFixedHeight(42);

             //wifi名字
            QLabel *wifiName = new QLabel(frontArea);
            ft.setPointSize(32);
            ft.bold();
            if(mInfos.at(j).state == QString::fromLocal8Bit("已连接")){
               pe.setColor(QPalette::Text, Qt::blue);
            }else if(mInfos.at(j).state == QString::fromLocal8Bit("正在连接")){
              pe.setColor(QPalette::Text, Qt::blue);
            }else{
              pe.setColor(QPalette::Text, Qt::black);
          }
            wifiName->setPalette(pe);
            //设置字体大小
            wifiName->setFont(ft);
            wifiName->setText(mInfos.at(j).SSID);


             //连接状态
            QLabel * wifiStatus = new QLabel(frontArea);
            ft.setPointSize(26);
            if(mInfos.at(j).state == QString::fromLocal8Bit("已连接")){
                            pe.setColor(QPalette::Text, Qt::blue);
            }else if(mInfos.at(j).state == QString::fromLocal8Bit("正在连接")){
                             pe.setColor(QPalette::Text, Qt::blue);
                        }else{
                            pe.setColor(QPalette::Text, Qt::black);
                        }
            //设置字体大小
            wifiStatus->setFont(ft);
            wifiStatus->setPalette(pe);
            wifiStatus->setText(mInfos.at(j).state);
            wifiStatus->setContentsMargins(0,0,0,0);

            //QWidget 包含 mac地址和加密类型
    //        QWidget *backArea = new QWidget(widget);
    //        backArea->setFixedSize(80, 42);
    //        QLabel *wifiMac = new QLabel(backArea);
    //        wifiMac->setText(mInfos.at(j).BSSID);
    //        QLabel *wifiEncryption = new QLabel(backArea);
    //         wifiEncryption->setText(mInfos.at(j).keytype);
    //         wifiEncryption->setContentsMargins(0,10,0,0);



            QVBoxLayout *verLayout = new QVBoxLayout;//垂直布局 上到下排列
            verLayout->setContentsMargins(0, 0, 0, 0);
            verLayout->setMargin(0);
            verLayout->setSpacing(0);
            verLayout->addWidget(wifiName);
            verLayout->addWidget(wifiStatus);
            frontArea->setLayout(verLayout);

    //        QVBoxLayout *verLayout2 = new QVBoxLayout;//垂直布局 上到下排列
    //        verLayout2->setContentsMargins(0, 0, 0, 0);// 设置垂直布局外间距
    //        verLayout2->setMargin(0);//设置垂直布局的边距
    //        verLayout2->setSpacing(0);//设置垂直布局的间距
    //        verLayout2->addWidget(wifiMac);
    //        verLayout2->addWidget(wifiEncryption);
    //        backArea->setLayout(verLayout2);

            QHBoxLayout *horLayout = new QHBoxLayout;//水平布局左右排列
            horLayout->setContentsMargins(0, 0, 0, 0); // 设置水平布局外间距
            horLayout->setMargin(0);//设置水平布局的边距
            horLayout->setSpacing(0);//设置水平布局的间距
            horLayout->addWidget(imageIcon);
            horLayout->addWidget(frontArea);
           // horLayout->addWidget(backArea);
            widget->setLayout(horLayout);

            //将widget作为列表的item
            QListWidgetItem *m_item = new QListWidgetItem();
            QSize size = m_item->sizeHint();
            m_item->setSizeHint(QSize(size.width(), 65));
             ui->listWidget->addItem(m_item);
            widget->setSizeIncrement(size.width(), 65);//设置大小增量
           // m_item->setTextAlignment(Qt::AlignHCenter);
            ui->listWidget->setItemWidget(m_item, widget);

                    }
                   }

}

mycustomdialogwifidisconnectiondialog.h

#ifndef MYCUSTOMDIALOGWIFIDISCONNECTIONDIALOG_H
#define MYCUSTOMDIALOGWIFIDISCONNECTIONDIALOG_H
#include <QDialog>
#include <QPushButton>
#include <QLabel>
#include <QMouseEvent>
#include <QFont>
#include <QPixmap>
#include <QPainter>
#include <QBitmap>
#include <QTimer>
#include <QMessageBox>
#include <QDebug>

class MyCustomDialogWifiDisconnectionDialog:public QDialog
{
     Q_OBJECT

public:
    MyCustomDialogWifiDisconnectionDialog(QWidget *parent = 0);
      ~MyCustomDialogWifiDisconnectionDialog();

signals:
    //取消保存
    void cancelSaveCallback(QString ssid);
   // void ConfirmCallback(QString path);
    //断开
    void disconnectCallbcak(QString ssid);
    //取消
    void CancelCallbcak();

public:
    QPushButton *btnCancelSave;
    QPushButton *btnDisconnect;
    QPushButton *btnCancel;
    QLabel *ask_label;
    QLabel *msg_label;

    QString ok_text;
    QString cancel_text;
public:
    void setInfo(QString name,QString state);
    QString getwifiName();
    void InitUi(int type,bool is_title_hidden,QString btntText,QString otherbtntText);

    void setCurrentIndex(int inputIndex);
    void setCurrentTotal(int inputTotal);
protected:
    QPoint move_point;
    bool mouse_press;

    void paintEvent(QPaintEvent *);

public slots:
    void CancelSaveOperate();
    void DisconnectOperate();
    void CancelOperate();

private:
    QString wifiSSid;
};

#endif // MYCUSTOMDIALOGWIFIDISCONNECTIONDIALOG_H

mycustomdialogwifidisconnectiondialog.cpp

#include "mycustomdialogwifidisconnectiondialog.h"

MyCustomDialogWifiDisconnectionDialog::MyCustomDialogWifiDisconnectionDialog(QWidget *parent): QDialog(parent)
{

}
MyCustomDialogWifiDisconnectionDialog::~MyCustomDialogWifiDisconnectionDialog(){

}

/**
 * @brief MsgBox::InitUi 初始化控件
 * @param type  参数为1时对话框只有一个按钮 参数为2时对话框只有两个按钮 参数为3时对话框只有三个按钮
 * @param is_title_hidden  true不显示标题   false 显示标题
 * @param btntText   默认确认
 * @param otherbtntText 其他按钮设置内容 为空显示默认值

 */
void MyCustomDialogWifiDisconnectionDialog::InitUi(int type,bool is_title_hidden,QString btntText ,QString otherbtntText){
    this->resize(500, 260);
    //获取主界面的宽度
    int width = this->width();
    int height = this->height();
    //初始化为未按下鼠标左键
    mouse_press = false;
    //设置标题栏隐藏
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
    //设置提示信息,让QLabel能够自动判断并换行显示:
    ask_label = new QLabel(this);
    QFont mfont = ask_label->font();

    mfont.setPointSize(28);
    ask_label->setFont(mfont);
    ask_label->setWordWrap(true);
    ask_label->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//手动设置靠右居中对齐
    ask_label->setIndent(10);//文本缩进 仅左右
  //  ask_label->setMargin(20);//设置内容范围的边框与控件边框的间距,上下左右
   //  ask_label->setGeometry(65, 90, width-85, 25*2);
     ask_label->setGeometry(100, 30, 300, 58);
     ask_label->setStyleSheet("QLabel{border:2px solid rgb(34, 166, 232);padding-left:15px;border-radius:10px;color:rgb(34, 166, 232);}");
    //连接状态

     msg_label = new QLabel(this);
     QFont mfont1 = msg_label->font();

     mfont1.setPointSize(28);
     msg_label->setFont(mfont);
     msg_label->setWordWrap(true);
     msg_label->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//手动设置靠右居中对齐
     msg_label->setIndent(10);//文本缩进 仅左右
     msg_label->setGeometry(100, 110, 300, 58);
     msg_label->setStyleSheet("QLabel{border:2px solid rgb(34, 166, 232);padding-left:15px;border-radius:10px;color:rgb(34, 166, 232);}");



     if(btntText == QString::fromLocal8Bit("")){
          btntText = tr("取消保存");
      }

     if(otherbtntText == QString::fromLocal8Bit("")){
         otherbtntText = tr("断开");
      }
  if(type ==3){//只显示三个button按钮

      btnCancelSave = new QPushButton(this);
      btnDisconnect = new QPushButton(this);
      btnCancel = new QPushButton(this);

        QString okBtn_style = "QPushButton{background:rgb(34, 166, 232); color:rgb(255,255,255); border-radius:10px; min-height:60px; min-width:100px; font:24px \"Microsoft YaHei\";}"
                                "QPushButton:hover{background:rgb(34, 167, 229);}"
                                "QPushButton:pressed{background:rgb(34, 167, 229);}";
        btnCancelSave->setStyleSheet(okBtn_style);

          QString otherBtn_style = "QPushButton{background:rgb(34, 166, 232); color:rgb(255,255,255); border-radius:10px; min-height:60px; min-width:100px; font:24px \"Microsoft YaHei\";}"
                                "QPushButton:hover{background:rgb(34, 167, 229);}"
                                "QPushButton:pressed{background:rgb(34, 167, 229);}";
          btnDisconnect->setStyleSheet(otherBtn_style);

          QString cancelBtn_style = "QPushButton{background:rgb(207, 222, 236); color:rgb(255,255,255); border-radius:10px; min-height:60px; min-width:100; font:24px \"Microsoft YaHei\";}"
                                    "QPushButton:hover{background:rgb(207, 222, 236);}"
                                    "QPushButton:pressed{background:rgb(207, 222, 236);}";
          btnCancel->setStyleSheet(cancelBtn_style);
//       QString style = "QLineEdit{border:2px solid rgb(34, 166, 232);padding-left:15px;border-radius:10px;color:rgb(34, 166, 232);font:22px \"Microsoft YaHei\";}"
//                      "QLineEdit:focus{border:2px solid rgb(34, 166, 232);}"
//                      "QLineEdit:disabled{background-color:rgb(255,255,255);}"
//                      "QLabel{color:rgb(34, 167, 229); font:24px \"Microsoft YaHei\"; font-weight:bold;}";



      btnCancelSave->resize(140, 48);
      btnCancelSave->move(width - btnCancelSave->width() - 20, height - 80);
      btnDisconnect->resize(140, 48);
      btnDisconnect->move(width-btnCancelSave->width()- btnCancelSave->width() - 40, height - 80);

      btnCancel->resize(140, 48);
      btnCancel->move(width -btnCancel->width() - btnDisconnect->width()- btnCancelSave->width()- 60, height - 80);
      btnCancelSave->setObjectName(QString::fromUtf8("pushButtonTwo"));
      btnDisconnect->setObjectName(QString::fromUtf8("pushButtonTwo"));
      btnCancel->setObjectName(QString::fromUtf8("pushButtonTwo"));
      btnCancelSave->setText(btntText);
      btnCancel->setText(tr("取消"));
      btnDisconnect->setText(otherbtntText);

      //设置默认按钮为取消按钮
      btnCancel->setFocus();
      QObject::connect(btnCancelSave, SIGNAL(clicked()), this, SLOT(CancelSaveOperate()));
      QObject::connect(btnDisconnect, SIGNAL(clicked()), this, SLOT(DisconnectOperate()));
      QObject::connect(btnCancel, SIGNAL(clicked()), this, SLOT(CancelOperate()));

    }




}


//设置对话框信息
void MyCustomDialogWifiDisconnectionDialog::setInfo(QString name,QString state)
{
   this->wifiSSid = name;
   //设置提示信息
   ask_label->setText("WIFI名称:\r"+name);
   msg_label->setText("状态信息:\r"+state);
}

QString MyCustomDialogWifiDisconnectionDialog::getwifiName()
{
    return wifiSSid;
}


void MyCustomDialogWifiDisconnectionDialog::paintEvent(QPaintEvent *)
{
  QPainter painter(this);
  painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  painter.setBrush(QBrush(QColor(255, 255, 255)));
      painter.setPen(Qt::transparent);
      QRect mRect = this->rect();
      mRect.setWidth(mRect.width() - 1);
      mRect.setHeight(mRect.height() - 1);
     // painter.drawRoundedRect(rect, 20, 20);
      //也可用QPainterPath 绘制代替 painter.drawRoundedRect(rect, 15, 15);
     QPainterPath painterPath;
     painterPath.addRoundedRect(mRect, 0, 0);
     painter.drawPath(painterPath);
}



//确认操作
void MyCustomDialogWifiDisconnectionDialog::CancelSaveOperate()
{
    qDebug()<<"确认操作";
    emit cancelSaveCallback(getwifiName());
    done(Accepted);

}

//取消操作
void MyCustomDialogWifiDisconnectionDialog::CancelOperate()
{
      qDebug()<<"取消操作";
      emit CancelCallbcak();
      done(Rejected);
}

//其他窗体操作
void MyCustomDialogWifiDisconnectionDialog::DisconnectOperate()
{
     qDebug()<<"其他操作";
     emit disconnectCallbcak(getwifiName());
     done(Accepted);
}









android 端当wifi变化的状态主动传送给qt层(**重点)

Interface.h

#ifndef INTERFACE_H
#define INTERFACE_H
#include <QObject>
#include <QStringList>
#ifdef ANDROID
#include <QtAndroidExtras/QAndroidJniObject>
#include <QAndroidJniEnvironment>
#include <QtAndroid>
#include<jni.h>
#endif

struct WifiInfoBean{
    QString SSID;
    QString BSSID;
    QString level;
    QString state;
    QString keytype;
};

class Interface : public QObject
{
    Q_OBJECT

public:
    static Interface* instance;
    explicit Interface(QObject *parent = nullptr);
     ~Interface();
public:


    static Interface *getInstance();
    //扫码结果的回调
    static  void  getQtWifiScanResults(JNIEnv *env,  jclass clzz,jstring jstr);
    //连接wifi 过程中 各种回调
    static  void  getWifiChangesState(JNIEnv *env,  jclass clzz,jstring jstr);
    //返回连接过程中刷新数据结果
    static  void getQtConnectingResults(JNIEnv *env,  jclass thiz,jobjectArray stringArray);
    bool registerNativeMethods();
    //传递wifilist对象
    static  void getQtwifiResultsList(JNIEnv *env,  jclass thiz,jobject wifilist);

    //扫描结束回调
    void ScanEndCallback(QString str);
    //连接发生变化通知
    void notificationWifiChangesCallBack(QString notification);

    //java传递过来的List<wifibean>对象;
     void  getWifiScanResultsList(QList<WifiInfoBean> mlist);
signals:
     //扫描结束通知 信号
    void ScanEndCallbackSignal();
    //连接wifi过程中的通知 信号
    void NotificationWifiChangesCallbackSignal(QString notificationStr);

public slots:
    //打开wifi
    void openQtWifi();
    //关闭wifi
    void closeQtWifi();
    //开始扫描wifi
    void  startScanningQtWifi();
    //获取wifi 开启状态
    int  getQtWifiEnabled();
    //获取当前已经连接的wifi
    QString getQtCurrentWifiSSID();
    //获取java 调用注册是否成功
    void getQtRegisterJavaCode(QString   registerCode);
    //连接wifi
     void connectQtWifi(QString capabilities,QString SSID ,QString PWD);
    //断开wifi连接
    void disConnectionQtWifi(QString ssid );
    //取消保存
     void removeQtWifi(QString ssid );
    //获取wifi扫描结果的数据列表
    QList<WifiInfoBean> getWifiScanResults();
    QList<WifiInfoBean>  GetWifiObjectList();
private:
     QList<WifiInfoBean> wifiList;


};

#endif // INTERFACE_H

Interface.cpp

#include "interface.h"
#include <QDebug>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include<android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "jason", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "jason", __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "jason", __VA_ARGS__))
//输入法 https://juejin.cn/post/7156015823180529694
/**
  java调用qt
 * @brief Interface::instance
 * android内存泄露之jnilocalreferencetableoverflow(max=512)
 * 链接 https://www.php1.cn/detail/web.html
 * 链接:
 * https://developer.aliyun.com/article/858081
 * JNI手动释放内存(避免内存泄露)
 * https://www.cnblogs.com/Free-Thinker/p/10615107.html
 * 参考连接
 * http://www.cnblogs.com/qinjunni/archive/2012/02/20/2359181.html
 */
Interface* Interface::instance = nullptr;
Interface::Interface(QObject *parent) : QObject(parent)
{


}

Interface::~Interface()
{
  //  delete instance;
    instance->deleteLater();
}
Interface *Interface::getInstance()
{
    if(instance == nullptr)
    {
        instance = new Interface();
    }
    return instance;
}


/**
  registerNativeMethods java类中的函数与c++中函数绑定
 * @brief Interface::registerNativeMethods
 * @return 成功  失败
 *
 * typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;

第一个变量name是Java中函数的名字。

第二个变量signature,用字符串是描述了函数的参数和返回值

第三个变量fnPtr是函数指针,指向C函数。

 */
bool Interface::registerNativeMethods()
{
    JNINativeMethod methods[]{
    {"GetQtScanResults", "(Ljava/lang/String;)V", (void*)getQtWifiScanResults},
    {"GetQtWifiChanges", "(Ljava/lang/String;)V", (void*)getWifiChangesState},
    {"wifiResultsList", "(Ljava/util/List;)V", (void*)getQtwifiResultsList}
    };
    jclass clazz;
    QAndroidJniEnvironment env;
    QAndroidJniObject javaClass("org/qtproject/example/NativeTools");
    clazz = env->GetObjectClass(javaClass.object<jobject>());
    bool result = false;
    if(clazz)
    {
        jint ret = env->RegisterNatives(clazz, methods, sizeof (methods) / sizeof (methods[0]));
        env->DeleteLocalRef(clazz);
        result = ret >= 0;
    }
    if(env->ExceptionCheck())
        env->ExceptionClear();
    return  result;
}




/**
  创建指定长度数组

native和static native区别
    public native String helloJni();
    public native static String helloJniStatic();
 区别在于第二个参数是jobject还是jclass,和java中static方法属于类而不属于对象一样,static 的native方法属于类,所以第二个参数是jclass而不是jobject。
JNIEXPORT jstring JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_helloJni
  (JNIEnv *, jobject);

JNIEXPORT jstring JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_helloJniStatic
  (JNIEnv *, jclass);


jobject获取jclass
  jclass cls = env->GetObjectClass(jobj);
jclass获取jobject
  jmethodID cid = env->GetMethodID(cls, "<init>", "()V");
  jobject  jobj = env->NewObject(cls, cid);注意:这里获取到的jobj已经是一个新的对象。

  */
void Interface::getQtWifiScanResults(__attribute__((unused))JNIEnv *env,  __attribute__((unused))jclass clzz,__attribute__((unused))jstring jstr){
   const char *a = env->GetStringUTFChars(jstr,NULL);
   QString qstr=QString(a);
   Interface::getInstance()->ScanEndCallback(qstr);
   env->ReleaseStringUTFChars(jstr,a);
   env->DeleteLocalRef(jstr);
   env->DeleteLocalRef(clzz);
}
/**
  java 主动调用qt
  扫描发生变化通知qt 刷新ui界面
 * @brief Interface::ScanEndCallback
 * @param str
 */
void Interface::ScanEndCallback(QString str){
   emit ScanEndCallbackSignal();
}
/**
  java 主动调用qt
 wifi连接过程中状态发生变化
 java需要主动通知qt
  连接中 失败 密码错误  成功
*/
void  Interface::getWifiChangesState(__attribute__((unused))JNIEnv *env,  __attribute__((unused))jclass clzz,__attribute__((unused))jstring jstr){
    const char *notification = env->GetStringUTFChars(jstr,NULL);
     QString qnotification=QString(notification);
     Interface::getInstance()->notificationWifiChangesCallBack(qnotification);
     env->ReleaseStringUTFChars(jstr,notification);
     env->DeleteLocalRef(jstr);
     env->DeleteLocalRef(clzz);
 }
/**
   java 主动调用qt
  通知qt wifi状态发生变化了刷新ui
 * @brief Interface::notificationWifiChangesCallBack
 * @param notification
 */
void Interface::notificationWifiChangesCallBack(QString notification){
    emit NotificationWifiChangesCallbackSignal(notification);
}





/**
  打开wifi qt主动调用java
 * @brief Interface::openQtWifi
 */
void Interface::openQtWifi()
{
    #ifdef Q_OS_ANDROID
        QAndroidJniObject activity = QtAndroid::androidActivity();
        activity.callMethod<void>("openSystemWiFi");
        QAndroidJniEnvironment env;
        if(env->ExceptionCheck())
        {
            env->ExceptionDescribe();
            env->ExceptionClear();

        }
#endif
}
/**
  开始扫描wifi  qt主动调用java
 * @brief Interface::startScanningQtWifi
 */
void Interface::startScanningQtWifi(){
#ifdef Q_OS_ANDROID
    QAndroidJniObject activity = QtAndroid::androidActivity();
    activity.callMethod<void>("getScanResult");
    QAndroidJniEnvironment env;
    if(env->ExceptionCheck())
    {
        env->ExceptionDescribe();
        env->ExceptionClear();

    }
#endif
}

/**关闭wifi  qt主动调用java
 * @brief Interface::closeQtWifi
 */
void Interface::closeQtWifi()
{
#ifdef Q_OS_ANDROID
    QAndroidJniObject activity = QtAndroid::androidActivity();
    activity.callMethod<void>("closeSystemWiFi");
    QAndroidJniEnvironment env;
    if(env->ExceptionCheck())
    {
        env->ExceptionDescribe();
        env->ExceptionClear();

    }
#endif
}
/**
  获取当前已经连接的wifi名称
 * @brief Interface::getQtCurrentWifiSSID
 * @return
 */
QString Interface::getQtCurrentWifiSSID(){
    #ifdef Q_OS_ANDROID
      QAndroidJniEnvironment env;
      QAndroidJniObject activity = QtAndroid::androidActivity();
     QAndroidJniObject ss=  activity.callObjectMethod("currentConnectionWifiName", "()Ljava/lang/String;");
     jstring string_java_wifi_name = static_cast<jstring>(ss.object());
     const char *c_str_wifi_name = env->GetStringUTFChars(string_java_wifi_name, 0);

     QString currentWifiName = QString(c_str_wifi_name);
     qDebug()<< "当前连接的是=" <<currentWifiName;
     env->ReleaseStringUTFChars(string_java_wifi_name,c_str_wifi_name);
     env->DeleteLocalRef(ss.object());
     if(env->ExceptionCheck())
     {
         env->ExceptionDescribe();
         env->ExceptionClear();
     }

     return currentWifiName;
    #endif
}


/**
   qt主动调用java 获取系统wifi开关是否打开
 * @brief Interface::getQtWifiEnabled
 * @return 获取wifi是否打开 状态 0不可用  1 可用
 */
int Interface::getQtWifiEnabled()
{
    #ifdef Q_OS_ANDROID

        QAndroidJniEnvironment env;
        QAndroidJniObject activity = QtAndroid::androidActivity();
         jint n = activity.callMethod<jint>("getWifiEnabled", "()I");
        if(env->ExceptionCheck())
        {
            env->ExceptionDescribe();
            env->ExceptionClear();

        }

        return n;
#endif
}



/**
  qt启动界面晚于Android 需要判断是否在main.cpp中注册成功
  如果qt注册成功,Android 才能调用通知给qt wifi列表发生变化了
 * @brief Interface::getQtRegisterJavaCode
 * @return
 */
void Interface::getQtRegisterJavaCode(QString registerCode)
{
    #ifdef Q_OS_ANDROID
        QAndroidJniEnvironment env;
        QAndroidJniObject activity = QtAndroid::androidActivity();
        QAndroidJniObject obj = QAndroidJniObject::fromString(registerCode);
        jstring string_java_code = static_cast<jstring>(obj.object());
        const char *c_str_code = env->GetStringUTFChars(string_java_code, 0);
         activity.callMethod<void>("getRegisterCode","(Ljava/lang/String;)V",string_java_code);
        //释放资源
        registerCode ="";
        env->ReleaseStringUTFChars(string_java_code,c_str_code);
        env->DeleteLocalRef(string_java_code);
        if(env->ExceptionCheck())
        {
            env->ExceptionDescribe();
            env->ExceptionClear();

        }


#endif
}


/**

  方式一 获取wifi字符串数组数据
 * @brief Interface::getWifiScanResults

   1.获取字符串数组的长度
   jsize stringArrayLength = env->GetArrayLength(stringArray);
   2.遍历字符串数组
   for(int i =0;i<stringArrayLength;i++){
      2.1 获取 jobject 数组中第 i 个元素
      注意 : 获取的是 jobject 类型变量
      函数原型 : jobject GetObjectArrayElement(jobjectArray array, jsize index)
      jobjectArray array 参数 : 是 Java 层传入的 Java 对象数组 参数 , 即 Native 层的调用函数的参数
      jsize index 参数 : 对象元素的索引值 , 取值范围 0 ~ stringArrayLength - 1
      返回值 : 返回的是 jobject 类型的变量
      jobject string_object = env->GetObjectArrayElement(stringArray, i);
             2.2 将 jobject 类型强转成 jstring 类型 , 这两个都代表了 Java 的数据类型
             jstring string_java = static_cast<jstring>(string_object);
            2.3 将 jstring 类型转为 char* 类型
               jstring 类型简介 :
                    class _jobject {};
                    class _jstring : public _jobject {};
                    typedef _jstring*       jstring;
                    由上面可见 , jstring 只是 继承了 _jobject 类 , 没有任何实现 , 是一个空类
                    因此需要借助 C/C++ 方法 将 java 类型的 jstring 字符串 其转为 C/C++ 类型的 char* 类型字符串
                 转换函数原型 : void ReleaseStringUTFChars(jstring string, const char* utf)
              const char *string_c = env->GetStringUTFChars(string_java, 0);
               2.4 打印 转换后的 字符串值
             qDebug()<<"打印字符串数组元素 : i="<<i<<" ;string_c="<<string_c;
               2.5 释放 char* 字符串
              env->ReleaseStringUTFChars(string_java, string_c);


 */
QList<WifiInfoBean> Interface::getWifiScanResults()

{
 #ifdef Q_OS_ANDROID
   wifiList.clear();
   QAndroidJniEnvironment env;
   QAndroidJniObject activity = QtAndroid::androidActivity();
   QAndroidJniObject strjobjectArray = activity.callObjectMethod("updateArrayStrings", "()[Ljava/lang/String;");
   jobjectArray objectArray = strjobjectArray.object<jobjectArray>();
   const int size = env->GetArrayLength(objectArray);
       for (int i = 0; i < size; i++) {
           //遍历string数组获取到 jobject对象
           jobject java_object = env->GetObjectArrayElement(objectArray, i);
           //将 jobject 类型强转成 jstring 类型 , 这两个都代表了 Java 的数据类型
           jstring string_java = static_cast<jstring>(java_object);
           const char *string_c = env->GetStringUTFChars(string_java, 0);
           QString str =QString(string_c);
          //切割字符串数组
          QStringList cuttingData = str.split(";");
            WifiInfoBean *info=new WifiInfoBean();
            info->SSID =cuttingData[0];
           info->BSSID=cuttingData[1];
           info->level=cuttingData[2];
           info->state =cuttingData[3];
           info->keytype=cuttingData[4];
           wifiList.append(*info);
           //释放结构体
           delete  info;
           env->ReleaseStringUTFChars(string_java,string_c);
           env->DeleteLocalRef(java_object);
          }
   objectArray =nullptr;
   strjobjectArray=nullptr;
   //释放数组 删除全局对象的引用
   env->DeleteGlobalRef(objectArray);
   env->DeleteLocalRef(strjobjectArray.object());
   if(env->ExceptionCheck())
     {
         env->ExceptionDescribe();
         env->ExceptionClear();
     }

 return wifiList;

#endif
}


/**
   方式二 获取wifi列表对象数据 QList<WifiInfoBean>
  java和C++互传ArrayList泛型对象参数
 * @brief Interface::getQtwifiResultsList
 * @param env
 * @param thiz
 * @param wifilist
 */
void Interface::getQtwifiResultsList(JNIEnv *env, jclass thiz, jobject wifilist)
{
     QList<WifiInfoBean> tempList;
    //class ArrayList
           jclass cls_arraylist = env->GetObjectClass(wifilist);
           //method in class ArrayList
           jmethodID arraylist_get = env->GetMethodID(cls_arraylist,"get","(I)Ljava/lang/Object;");
           jmethodID arraylist_size = env->GetMethodID(cls_arraylist,"size","()I");
           jint len = env->CallIntMethod(wifilist,arraylist_size);
         //  LOGE("len=%d\n",len);
         //  printf("get java ArrayList<WifiBean> object by C++ , then print it...../n");
           for(int i=0;i<len;i++){
                  jobject obj_wifibean = env->CallObjectMethod(wifilist,arraylist_get,i);
                  jclass cls_wifibean = env->GetObjectClass(obj_wifibean);
                  jmethodID wifibean_wifiName = env->GetMethodID(cls_wifibean,"getWifiName","()Ljava/lang/String;");
                  jmethodID wifibean_macAddress = env->GetMethodID(cls_wifibean,"getMacAddress","()Ljava/lang/String;");
                  jmethodID wifibean_level = env->GetMethodID(cls_wifibean,"getLevel","()Ljava/lang/String;");
                  jmethodID wifibean_state = env->GetMethodID(cls_wifibean,"getState","()Ljava/lang/String;");
                  jmethodID wifibean_capabilities = env->GetMethodID(cls_wifibean,"getCapabilities","()Ljava/lang/String;");
                  jstring ssid = (jstring)env->CallObjectMethod(obj_wifibean,wifibean_wifiName);
                  jstring bssid = (jstring)env->CallObjectMethod(obj_wifibean,wifibean_macAddress);
                  jstring level = (jstring)env->CallObjectMethod(obj_wifibean,wifibean_level);
                  jstring state = (jstring)env->CallObjectMethod(obj_wifibean,wifibean_state);
                  jstring capabilities = (jstring)env->CallObjectMethod(obj_wifibean,wifibean_capabilities);
                  const char *c_ssid = env->GetStringUTFChars(ssid,0);
                  const char *c_bssid = env->GetStringUTFChars(bssid,0);
                  const char *c_level = env->GetStringUTFChars(level,0);
                  const char *c_state = env->GetStringUTFChars(state,0);
                  const char *c_capabilities = env->GetStringUTFChars(capabilities,0);
               //    LOGE("c_ssid=%s c_bssid=%s1 c_level=%s2 c_state=%s3 c_capabilities=%s4" ,c_ssid,c_bssid,c_level,c_state,c_capabilities);
                   WifiInfoBean *info=new WifiInfoBean();
                   info->SSID =QString(c_ssid);
                  info->BSSID=QString(c_bssid);
                  info->level=QString(c_level);
                  info->state =QString(c_state);
                  info->keytype=QString(c_capabilities);
                  tempList.append(*info);
                  //释放结构体
                  delete  info;
                  env->ReleaseStringUTFChars(ssid,c_ssid);
                  env->ReleaseStringUTFChars(bssid,c_bssid);
                  env->ReleaseStringUTFChars(level,c_level);
                  env->ReleaseStringUTFChars(state,c_state);
                  env->ReleaseStringUTFChars(capabilities,c_capabilities);
                  //释放jmethodID
                 env->DeleteLocalRef(cls_wifibean);
                 env->DeleteLocalRef(obj_wifibean);

           }
           Interface::getInstance()->getWifiScanResultsList( tempList);
           tempList.clear();
           env->DeleteLocalRef(cls_arraylist);


}

/**
 getQtwifiResultsList  java传ArrayList泛型对象参数 给C++
 * @brief Interface::getWifiScanResultsList
 * @param list
 * @return
 */
void Interface::getWifiScanResultsList( QList<WifiInfoBean> mlist)
{
    if(mlist.size()!=0 && !mlist.isEmpty()){
    wifiList.clear();
    wifiList.append(mlist);
    GetWifiObjectList();
  }
}


QList<WifiInfoBean> Interface::GetWifiObjectList()
{
 return wifiList;

}


/**
  连接wifi
 * @brief Interface::connectQtWifi
 * @param position
 * @param SSID
 * @param PWD
 */
void Interface::connectQtWifi(QString capabilities,QString SSID ,QString PWD)
//void Interface::connectQtWifi(qint32 position, QString SSID ,QString PWD)
{
#ifdef Q_OS_ANDROID
         QAndroidJniEnvironment env;
         QAndroidJniObject m_activity = QtAndroid::androidActivity();
         QAndroidJniObject jcapabilities = QAndroidJniObject::fromString(capabilities);
         jstring string_java_capabilities = static_cast<jstring>(jcapabilities.object());
         QAndroidJniObject jssid = QAndroidJniObject::fromString(SSID);
         jstring string_java_wifiname = static_cast<jstring>(jssid.object());
         QAndroidJniObject jpwd = QAndroidJniObject::fromString(PWD);
           jstring string_java_password = static_cast<jstring>(jpwd.object());
         QAndroidJniObject jmethod = m_activity.callObjectMethod("connectWifi", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",string_java_capabilities,string_java_wifiname,string_java_password);
         jobject jobj = jmethod.object();
         //将 jobject 类型强转成 jstring 类型 , 这两个都代表了 Java 的数据类型
         jstring javaStr = static_cast<jstring>(jobj);
         const char *c_str = env->GetStringUTFChars(javaStr, 0);
        //释放资源
        env->ReleaseStringUTFChars(javaStr,c_str);
        env->DeleteLocalRef(jobj);
        env->DeleteLocalRef(jmethod.object());
        env->DeleteLocalRef(string_java_capabilities);
        env->DeleteLocalRef(string_java_wifiname);
        env->DeleteLocalRef(string_java_password);
       if(env->ExceptionCheck()){
                    env->ExceptionDescribe();
                    env->ExceptionClear();
               }

   #endif
}
/**
  断开连接
 * @brief Interface::disConnectionQtWifi
 * @param position
 */
void Interface::disConnectionQtWifi(QString ssid)
{
#ifdef Q_OS_ANDROID
         QAndroidJniEnvironment env;
         QAndroidJniObject m_activity = QtAndroid::androidActivity();
         QAndroidJniObject jssid = QAndroidJniObject::fromString(ssid);
         //将 jobject 类型强转成 jstring 类型 , 这两个都代表了 Java 的数据类型
         jstring string_java_ssid = static_cast<jstring>(jssid.object());
          QAndroidJniObject disconnectObject = m_activity.callObjectMethod("disconnectWifi", "(Ljava/lang/String;)Ljava/lang/String;",string_java_ssid);
          jobject jdisconnect = disconnectObject.object();
          //将 jobject 类型强转成 jstring 类型 , 这两个都代表了 Java 的数据类型
          jstring java_disconnect_str = static_cast<jstring>(jdisconnect);
          const char *c_disconnect_str = env->GetStringUTFChars(java_disconnect_str, 0);
        //释放jstring
        env->ReleaseStringUTFChars(java_disconnect_str,c_disconnect_str);
        env->DeleteLocalRef(jdisconnect);
        env->DeleteLocalRef(disconnectObject.object());
        env->DeleteLocalRef(string_java_ssid);
       if(env->ExceptionCheck()){
                    env->ExceptionDescribe();
                    env->ExceptionClear();
               }

#endif
}
/**
  删除取消保存
 * @brief Interface::removeQtWifi
 * @param ssid
 */
void Interface::removeQtWifi(QString ssid)
{
#ifdef Q_OS_ANDROID
     QAndroidJniEnvironment env;
     QAndroidJniObject m_activity = QtAndroid::androidActivity();
     QAndroidJniObject jssid = QAndroidJniObject::fromString(ssid);
     jstring string_java_remove_ssid = static_cast<jstring>(jssid.object());
     QAndroidJniObject jremove = m_activity.callObjectMethod("removeWifi", "(Ljava/lang/String;)Ljava/lang/String;",string_java_remove_ssid);
    const char *remove_str = env->GetStringUTFChars(string_java_remove_ssid, 0);
    //释放jstring
    env->ReleaseStringUTFChars(string_java_remove_ssid,remove_str);
    env->DeleteLocalRef(string_java_remove_ssid);
    env->DeleteLocalRef(jremove.object());
       if(env->ExceptionCheck()){
          env->ExceptionDescribe();
          env->ExceptionClear();
       }

#endif
}









main.cpp 中初始化

int main(int argc, char *argv[])
{
#ifdef Q_OS_ANDROID
    bool success = Interface::getInstance()->registerNativeMethods();
    if(success){
        qDebug()<<"jason"<<"注册成功"<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
         Interface::getInstance()->getQtRegisterJavaCode("1");
    } else{
          qDebug()<<"jason"<<"注册失败"<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
          Interface::getInstance()->getQtRegisterJavaCode("0");
    }
#endif
}

如果对你有帮助记得点赞!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt中,我们可以使用Qt的Network相关类来实现Android设备的WiFi连接。 首先,要确保在.pro文件中已正确添加了Qt Network模块的依赖: ``` QT += network ``` 然后,我们可以使用QNetworkConfigurationManager类来获取系统中的网络配置信息: ``` QNetworkConfigurationManager configManager; QList<QNetworkConfiguration> configurations = configManager.allConfigurations(); ``` 接下来,我们需要筛选出WiFi网络,并选择一个可用的网络配置进行连接。可以使用QNetworkConfiguration的isBearerTypeMatch方法来判断网络是否为WiFi类型,如下所示: ``` QNetworkConfiguration wifiConfig; foreach (const QNetworkConfiguration &config, configurations) { if (config.bearerType() == QNetworkConfiguration::BearerWLAN) { wifiConfig = config; break; } } ``` 然后,我们可以使用QNetworkSession类来建立WiFi连接并管理网络会话。我们需要先通过QNetworkConfigurationManager类的configurationFromIdentifier方法获取WiFi网络配置,然后通过QNetworkSession的open方法来建立连接: ``` QNetworkConfiguration wifiConfig = configManager.configurationFromIdentifier(wifiConfig.identifier()); QNetworkSession *wifiSession = new QNetworkSession(wifiConfig, this); wifiSession->open(); ``` 最后,我们可以在QNetworkSession的stateChanged信号中监听网络连接状态的变化,并在需要的时候执行相应的操作: ``` connect(wifiSession, &QNetworkSession::stateChanged, [=](QNetworkSession::State state){ if (state == QNetworkSession::Connected) { // 网络已连接,可执行相关操作 } }); ``` 以上是使用Qt实现Android设备的WiFi连接的基本步骤,需要注意的是,在Android平台上,还需要在AndroidManifest.xml文件中添加相关权限和特性的声明,如访问网络权限和使用WiFi权限等。 希望以上回答能对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值