From c3035523bef9711db032252779f87dd380a5dcd4 Mon Sep 17 00:00:00 2001 From: kongqw Date: Fri, 5 May 2023 12:23:09 +0800 Subject: [PATCH] update --- .gitignore | 8 + README.md | 193 ++++++++ WiFiLibrary/.gitignore | 1 + WiFiLibrary/build.gradle | 31 ++ WiFiLibrary/proguard-rules.pro | 17 + WiFiLibrary/src/main/AndroidManifest.xml | 32 ++ .../kongqw/wifilibrary/BaseWiFiManager.java | 429 ++++++++++++++++++ .../kongqw/wifilibrary/SecurityModeEnum.java | 10 + .../com/kongqw/wifilibrary/WiFiManager.java | 356 +++++++++++++++ .../listener/OnWifiConnectListener.java | 29 ++ .../listener/OnWifiEnabledListener.java | 15 + .../listener/OnWifiScanResultsListener.java | 19 + WiFiLibrary/src/main/res/values/strings.xml | 3 + app/.gitignore | 1 + app/build.gradle | 37 ++ app/proguard-rules.pro | 17 + app/src/main/AndroidManifest.xml | 24 + .../ExampleApplication.java | 21 + .../kqwwifimanagerdemo/MainActivity.java | 318 +++++++++++++ .../adapter/WifiListAdapter.java | 86 ++++ .../view/ConnectWifiDialog.java | 76 ++++ app/src/main/res/anim/dialog_bottom_in.xml | 8 + app/src/main/res/anim/dialog_bottom_out.xml | 8 + app/src/main/res/layout/activity_main.xml | 69 +++ .../main/res/layout/dialog_connect_wifi.xml | 46 ++ app/src/main/res/layout/item_wifi.xml | 18 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes app/src/main/res/values-v21/styles.xml | 2 + app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/styles.xml | 42 ++ build.gradle | 28 ++ gradle.properties | 18 + gradlew | 160 +++++++ gradlew.bat | 90 ++++ settings.gradle | 1 + 42 files changed, 2235 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 WiFiLibrary/.gitignore create mode 100644 WiFiLibrary/build.gradle create mode 100644 WiFiLibrary/proguard-rules.pro create mode 100644 WiFiLibrary/src/main/AndroidManifest.xml create mode 100644 WiFiLibrary/src/main/java/com/kongqw/wifilibrary/BaseWiFiManager.java create mode 100644 WiFiLibrary/src/main/java/com/kongqw/wifilibrary/SecurityModeEnum.java create mode 100644 WiFiLibrary/src/main/java/com/kongqw/wifilibrary/WiFiManager.java create mode 100644 WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiConnectListener.java create mode 100644 WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiEnabledListener.java create mode 100644 WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiScanResultsListener.java create mode 100644 WiFiLibrary/src/main/res/values/strings.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/kong/qingwei/kqwwifimanagerdemo/ExampleApplication.java create mode 100644 app/src/main/java/kong/qingwei/kqwwifimanagerdemo/MainActivity.java create mode 100644 app/src/main/java/kong/qingwei/kqwwifimanagerdemo/adapter/WifiListAdapter.java create mode 100644 app/src/main/java/kong/qingwei/kqwwifimanagerdemo/view/ConnectWifiDialog.java create mode 100644 app/src/main/res/anim/dialog_bottom_in.xml create mode 100644 app/src/main/res/anim/dialog_bottom_out.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/dialog_connect_wifi.xml create mode 100644 app/src/main/res/layout/item_wifi.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6cbe56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c0f3d8 --- /dev/null +++ b/README.md @@ -0,0 +1,193 @@ +# Android WIFI控制 + +[![](https://jitpack.io/v/kongqw/AndroidWiFiManager.svg)](https://jitpack.io/#kongqw/AndroidWiFiManager) + +Step 1. Add the JitPack repository to your build file + +Add it in your root build.gradle at the end of repositories: + +``` gradle +allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + } +} +``` + +Step 2. Add the dependency + +``` gradle +dependencies { + compile 'com.github.kongqw:AndroidWiFiManager:1.1.1' +} +``` + +## 初始化 + +``` java +// WIFI管理器 +mWiFiManager = new WiFiManager(getApplicationContext()); +``` + +## 打开WIFI + +``` java +mWiFiManager.openWiFi(); +``` + +## 关闭WIFI + +``` java +mWiFiManager.closeWiFi(); +``` + +## 添加WIFI开关状态的监听 + +``` java +mWiFiManager.setOnWifiEnabledListener(this); +``` + +### 回调 + +``` java +/** + * WIFI开关状态的回调 + * + * @param enabled true 打开 false 关闭 + */ +@Override +public void onWifiEnabled(boolean enabled) { + // TODO +} +``` + +## 移除WIFI开关状态的监听 + +``` java +mWiFiManager.removeOnWifiEnabledListener(); +``` + +## 获取WIFI列表 + +``` java +List scanResults = mWiFiManager.getScanResults(); +``` + +### 获取WIFI加密方式 + +``` java +mWiFiManager.getSecurityMode(scanResult) +``` + +> 注意:Android 6.0需要动态获取 Manifest.permission.ACCESS_FINE_LOCATION 或 Manifest.permission.ACCESS_COARSE_LOCATION 后,才能正常获取到WIFI列表。 + +## 添加获取WIFI列表的监听 + +``` java +mWiFiManager.setOnWifiScanResultsListener(this); +``` + +### 回调 + +``` java +/** + * WIFI列表刷新后的回调 + * + * @param scanResults 扫描结果 + */ +@Override +public void onScanResults(List scanResults) { + // TODO +} +``` + +> mWiFiManager.getScanResults(); 是返回当前的WIFI列表,回调返回的是扫描更新以后新的WIFI列表。 + +## 移除获取WIFI列表的监听 + +``` java +mWiFiManager.removeOnWifiScanResultsListener(); +``` + +## 连接到开放网络 + +``` java +mWiFiManager.connectOpenNetwork(scanResult.SSID); +``` + +## 连接到WPA/WPA2网络 + +``` java +mWiFiManager.connectWPA2Network(scanResult.SSID, password); +``` + +## 连接到WEP网络 + +``` java +mWiFiManager.connectWEPNetwork(scanResult.SSID, password); +``` + +## 添加连接WIFI的监听 + +``` java +mWiFiManager.setOnWifiConnectListener(this); +``` + +### 回调 + +``` java +/** + * WIFI连接的Log得回调 + * + * @param log log + */ +@Override +public void onWiFiConnectLog(String log) { + Log.i(TAG, "onWiFiConnectLog: " + log); + // TODO +} + +/** + * WIFI连接成功的回调 + * + * @param SSID 热点名 + */ +@Override +public void onWiFiConnectSuccess(String SSID) { + Log.i(TAG, "onWiFiConnectSuccess: [ " + SSID + " ] 连接成功"); + // TODO +} + +/** + * WIFI连接失败的回调 + * + * @param SSID 热点名 + */ +@Override +public void onWiFiConnectFailure(String SSID) { + Log.i(TAG, "onWiFiConnectFailure: [ " + SSID + " ] 连接失败"); + // TODO +} +``` + +## 移除连接WIFI的监听 + +``` java +mWiFiManager.removeOnWifiConnectListener(); +``` + +## 断开网络连接 + +``` java +mWiFiManager.disconnectWifi(connectionInfo.getNetworkId()); +``` + +## 删除网络配置 + +> 只能删除自己创建的配置,其他应用生成的配置需要Root权限才可以删除。 + +``` java +mWiFiManager.deleteConfig(wifiConfiguration.networkId); +``` + diff --git a/WiFiLibrary/.gitignore b/WiFiLibrary/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/WiFiLibrary/.gitignore @@ -0,0 +1 @@ +/build diff --git a/WiFiLibrary/build.gradle b/WiFiLibrary/build.gradle new file mode 100644 index 0000000..cb89cfd --- /dev/null +++ b/WiFiLibrary/build.gradle @@ -0,0 +1,31 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + implementation 'com.android.support:appcompat-v7:25.2.0' + testImplementation 'junit:junit:4.13.2' +} diff --git a/WiFiLibrary/proguard-rules.pro b/WiFiLibrary/proguard-rules.pro new file mode 100644 index 0000000..53cf8d6 --- /dev/null +++ b/WiFiLibrary/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/kongqingwei/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/WiFiLibrary/src/main/AndroidManifest.xml b/WiFiLibrary/src/main/AndroidManifest.xml new file mode 100644 index 0000000..cdf43ac --- /dev/null +++ b/WiFiLibrary/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/BaseWiFiManager.java b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/BaseWiFiManager.java new file mode 100644 index 0000000..20088ec --- /dev/null +++ b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/BaseWiFiManager.java @@ -0,0 +1,429 @@ +package com.kongqw.wifilibrary; + +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.support.annotation.NonNull; +import android.text.TextUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by kongqingwei on 2017/2/17. + * BaseWiFiManager + */ +public class BaseWiFiManager { + + static WifiManager mWifiManager; + + private static ConnectivityManager mConnectivityManager; + + BaseWiFiManager(Context context) { + // 取得WifiManager对象 + mWifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + + mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + } + + /** + * 添加开放网络配置 + * + * @param ssid SSID + * @return NetworkId + */ + int setOpenNetwork(@NonNull 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(@NonNull String ssid, @NonNull 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(@NonNull String ssid, @NonNull 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(@NonNull String ssid) { + ssid = addDoubleQuotation(ssid); + List existingConfigs = getConfiguredNetworks(); + if (null != existingConfigs) { + for (WifiConfiguration existingConfig : existingConfigs) { + 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 getScanResults() { + // 得到扫描结果 + if (null != mWifiManager) { + return mWifiManager.getScanResults(); + } + return null; + } + + /** + * 排除重复 + * + * @param scanResults 带处理的数据 + * @return 去重数据 + */ + public static ArrayList excludeRepetition(List scanResults) { + HashMap 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 results = new ArrayList<>(); + for (Map.Entry entry : hashMap.entrySet()) { + results.add(entry.getValue()); + } + + return results; + } + + /** + * 获取配置过的WIFI信息 + * + * @return 配置信息 + */ + private List 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; + } + + /** + * 断开当前的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 getSecurityMode(@NonNull ScanResult scanResult) { + String capabilities = scanResult.capabilities; + + if (capabilities.contains("WPA")) { + 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 + "\""; + } +} diff --git a/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/SecurityModeEnum.java b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/SecurityModeEnum.java new file mode 100644 index 0000000..b4304d2 --- /dev/null +++ b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/SecurityModeEnum.java @@ -0,0 +1,10 @@ +package com.kongqw.wifilibrary; + +/** + * Created by kongqingwei on 2017/3/8. + * OPEN, WEP, WPA, WPA2 + */ + +public enum SecurityModeEnum { + OPEN, WEP, WPA, WPA2 +} diff --git a/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/WiFiManager.java b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/WiFiManager.java new file mode 100644 index 0000000..84271a5 --- /dev/null +++ b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/WiFiManager.java @@ -0,0 +1,356 @@ +package com.kongqw.wifilibrary; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.wifi.ScanResult; +import android.net.wifi.SupplicantState; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Handler; +import android.os.Message; +import android.support.annotation.NonNull; +import android.util.Log; + +import com.kongqw.wifilibrary.listener.OnWifiConnectListener; +import com.kongqw.wifilibrary.listener.OnWifiEnabledListener; +import com.kongqw.wifilibrary.listener.OnWifiScanResultsListener; + +import java.util.List; + + +/** + * Created by kqw on 2016/8/2. + * WifiManager : https://developer.android.com/reference/android/net/wifi/WifiManager.html + * WifiConfiguration : https://developer.android.com/reference/android/net/wifi/WifiConfiguration.html + * ScanResult : https://developer.android.com/reference/android/net/wifi/ScanResult.html + * WifiInfo : https://developer.android.com/reference/android/net/wifi/WifiInfo.html + * Wifi管理 + */ +public class WiFiManager extends BaseWiFiManager { + + private static final String TAG = "WiFiManager"; + private static WiFiManager mWiFiManager; + private static CallBackHandler mCallBackHandler = new CallBackHandler(); + private static final int WIFI_STATE_ENABLED = 0; + private static final int WIFI_STATE_DISABLED = 1; + private static final int SCAN_RESULTS_UPDATED = 3; + private static final int WIFI_CONNECT_LOG = 4; + private static final int WIFI_CONNECT_SUCCESS = 5; + private static final int WIFI_CONNECT_FAILURE = 6; + + 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(@NonNull 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(@NonNull String ssid, @NonNull String password) { + // 获取networkId + int networkId = setWEPNetwork(ssid, password); + if (-1 != networkId) { + // 保存配置 + boolean isSave = saveConfiguration(); + // 连接网络 + boolean isEnable = enableNetwork(networkId); + + return isSave && isEnable; + } + return false; + } + + /** + * 连接到WPA2网络 + * + * @param ssid 热点名 + * @param password 密码 + * @return 配置是否成功 + */ + public boolean connectWPA2Network(@NonNull String ssid, @NonNull String password) { + // 获取networkId + int networkId = setWPA2Network(ssid, password); + if (-1 != networkId) { + // 保存配置 + boolean isSave = saveConfiguration(); + // 连接网络 + boolean isEnable = enableNetwork(networkId); + + return isSave && isEnable; + } + return false; + } + + /* *******************************************************************************************/ + + + /** + * 广播接收者 + */ + public static class NetworkBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + + switch (intent.getAction()) { + case WifiManager.WIFI_STATE_CHANGED_ACTION: // WIFI状态发生变化 + switch (intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)) { + case WifiManager.WIFI_STATE_ENABLING: + Log.i(TAG, "onReceive: 正在打开 WIFI..."); + break; + case WifiManager.WIFI_STATE_ENABLED: + Log.i(TAG, "onReceive: WIFI 已打开"); + mCallBackHandler.sendEmptyMessage(WIFI_STATE_ENABLED); + break; + case WifiManager.WIFI_STATE_DISABLING: + Log.i(TAG, "onReceive: 正在关闭 WIFI..."); + break; + case WifiManager.WIFI_STATE_DISABLED: + Log.i(TAG, "onReceive: WIFI 已关闭"); + mCallBackHandler.sendEmptyMessage(WIFI_STATE_DISABLED); + break; + case WifiManager.WIFI_STATE_UNKNOWN: + default: + Log.i(TAG, "onReceive: WIFI 状态未知!"); + break; + } + break; + case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION: // WIFI扫描完成 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { + boolean isUpdated = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false); + Log.i(TAG, "onReceive: WIFI扫描 " + (isUpdated ? "完成" : "未完成")); + } else { + Log.i(TAG, "onReceive: WIFI扫描完成"); + } + + Message scanResultsMessage = Message.obtain(); + scanResultsMessage.what = SCAN_RESULTS_UPDATED; + scanResultsMessage.obj = wifiManager.getScanResults(); + mCallBackHandler.sendMessage(scanResultsMessage); + break; + case WifiManager.NETWORK_STATE_CHANGED_ACTION: // WIFI连接状态发生改变 +// Log.i(TAG, "onReceive: WIFI连接状态发生改变"); +// NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); +// if (null != networkInfo && ConnectivityManager.TYPE_WIFI == networkInfo.getType()) { +// } + WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO); + if (null != wifiInfo && wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) { + String ssid = wifiInfo.getSSID(); + Log.i(TAG, "onReceive: 网络连接成功 ssid = " + ssid); + } + break; + case WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION: + boolean isConnected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false); + Log.i(TAG, "onReceive: SUPPLICANT_CONNECTION_CHANGE_ACTION isConnected = " + isConnected); + break; + case WifiManager.SUPPLICANT_STATE_CHANGED_ACTION: // WIFI连接请求状态发生改变 + // 获取连接状态 + SupplicantState supplicantState = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); + + Message logMessage = Message.obtain(); + logMessage.what = WIFI_CONNECT_LOG; + logMessage.obj = supplicantState.toString(); + logMessage.obj = supplicantState.toString(); + mCallBackHandler.sendMessage(logMessage); + + switch (supplicantState) { + case INTERFACE_DISABLED: // 接口禁用 + Log.i(TAG, "onReceive: INTERFACE_DISABLED 接口禁用"); + break; + case DISCONNECTED:// 断开连接 +// Log.i(TAG, "onReceive: DISCONNECTED:// 断开连接"); +// break; + case INACTIVE: // 不活跃的 + WifiInfo connectFailureInfo = wifiManager.getConnectionInfo(); + Log.i(TAG, "onReceive: INACTIVE 不活跃的 connectFailureInfo = " + connectFailureInfo); + if (null != connectFailureInfo) { + Message wifiConnectFailureMessage = Message.obtain(); + wifiConnectFailureMessage.what = WIFI_CONNECT_FAILURE; + wifiConnectFailureMessage.obj = connectFailureInfo.getSSID(); + mCallBackHandler.sendMessage(wifiConnectFailureMessage); + // 断开连接 + int networkId = connectFailureInfo.getNetworkId(); + boolean isDisable = wifiManager.disableNetwork(networkId); + boolean isDisconnect = wifiManager.disconnect(); + Log.i(TAG, "onReceive: 断开连接 = " + (isDisable && isDisconnect)); + } + break; + case SCANNING: // 正在扫描 + Log.i(TAG, "onReceive: SCANNING 正在扫描"); + break; + case AUTHENTICATING: // 正在验证 + Log.i(TAG, "onReceive: AUTHENTICATING: // 正在验证"); + break; + case ASSOCIATING: // 正在关联 + Log.i(TAG, "onReceive: ASSOCIATING: // 正在关联"); + break; + case ASSOCIATED: // 已经关联 + Log.i(TAG, "onReceive: ASSOCIATED: // 已经关联"); + break; + case FOUR_WAY_HANDSHAKE: + Log.i(TAG, "onReceive: FOUR_WAY_HANDSHAKE:"); + break; + case GROUP_HANDSHAKE: + Log.i(TAG, "onReceive: GROUP_HANDSHAKE:"); + break; + case COMPLETED: // 完成 + Log.i(TAG, "onReceive: WIFI_CONNECT_SUCCESS: // 完成"); + WifiInfo connectSuccessInfo = wifiManager.getConnectionInfo(); + if (null != connectSuccessInfo) { + Message wifiConnectSuccessMessage = Message.obtain(); + wifiConnectSuccessMessage.what = WIFI_CONNECT_SUCCESS; + wifiConnectSuccessMessage.obj = connectSuccessInfo.getSSID(); + mCallBackHandler.sendMessage(wifiConnectSuccessMessage); + } + break; + case DORMANT: + Log.i(TAG, "onReceive: DORMANT:"); + break; + case UNINITIALIZED: // 未初始化 + Log.i(TAG, "onReceive: UNINITIALIZED: // 未初始化"); + break; + case INVALID: // 无效的 + Log.i(TAG, "onReceive: INVALID: // 无效的"); + break; + default: + break; + } + break; + default: + break; + } + } + } + + + private static class CallBackHandler extends Handler { + + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case WIFI_STATE_ENABLED: // WIFI已经打开 + if (null != mOnWifiEnabledListener) { + mOnWifiEnabledListener.onWifiEnabled(true); + } + break; + case WIFI_STATE_DISABLED: // WIFI已经关闭 + if (null != mOnWifiEnabledListener) { + mOnWifiEnabledListener.onWifiEnabled(false); + } + break; + case SCAN_RESULTS_UPDATED: // WIFI扫描完成 + if (null != mOnWifiScanResultsListener) { + @SuppressWarnings("unchecked") + List scanResults = (List) msg.obj; + mOnWifiScanResultsListener.onScanResults(scanResults); + } + break; + case WIFI_CONNECT_LOG: // WIFI连接完成 + if (null != mOnWifiConnectListener) { + String log = (String) msg.obj; + mOnWifiConnectListener.onWiFiConnectLog(log); + } + break; + case WIFI_CONNECT_SUCCESS: // WIFI连接完成 + if (null != mOnWifiConnectListener) { + String ssid = (String) msg.obj; + mOnWifiConnectListener.onWiFiConnectSuccess(ssid); + } + break; + case WIFI_CONNECT_FAILURE: // WIFI连接完成 + if (null != mOnWifiConnectListener) { + String ssid = (String) msg.obj; + mOnWifiConnectListener.onWiFiConnectFailure(ssid); + } + break; + default: + break; + } + } + } + + private static OnWifiEnabledListener mOnWifiEnabledListener; + + private static OnWifiScanResultsListener mOnWifiScanResultsListener; + + private 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; + } +} diff --git a/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiConnectListener.java b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiConnectListener.java new file mode 100644 index 0000000..b0ed8c0 --- /dev/null +++ b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiConnectListener.java @@ -0,0 +1,29 @@ +package com.kongqw.wifilibrary.listener; + +/** + * Created by kqw on 2016/8/4. + * WIFI连接的回调接口 + */ +public interface OnWifiConnectListener { + + /** + * WIFI连接信息的回调 + * + * @param log log + */ + void onWiFiConnectLog(String log); + + /** + * WIFI连接成功的回调 + * + * @param SSID 热点名 + */ + void onWiFiConnectSuccess(String SSID); + + /** + * WIFI连接失败的回调 + * + * @param SSID 热点名 + */ + void onWiFiConnectFailure(String SSID); +} diff --git a/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiEnabledListener.java b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiEnabledListener.java new file mode 100644 index 0000000..4198fd0 --- /dev/null +++ b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiEnabledListener.java @@ -0,0 +1,15 @@ +package com.kongqw.wifilibrary.listener; + +/** + * Created by kqw on 2016/8/4. + * WIFI打开关闭的回调接口 + */ +public interface OnWifiEnabledListener { + + /** + * WIFI开关的回调 + * + * @param enabled true 可用 false 不可用 + */ + void onWifiEnabled(boolean enabled); +} diff --git a/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiScanResultsListener.java b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiScanResultsListener.java new file mode 100644 index 0000000..d1e6f6d --- /dev/null +++ b/WiFiLibrary/src/main/java/com/kongqw/wifilibrary/listener/OnWifiScanResultsListener.java @@ -0,0 +1,19 @@ +package com.kongqw.wifilibrary.listener; + +import android.net.wifi.ScanResult; + +import java.util.List; + +/** + * Created by kqw on 2016/8/4. + * WIFI扫描结果的回调接口 + */ +public interface OnWifiScanResultsListener { + + /** + * 扫描结果的回调 + * + * @param scanResults 扫描结果 + */ + void onScanResults(List scanResults); +} diff --git a/WiFiLibrary/src/main/res/values/strings.xml b/WiFiLibrary/src/main/res/values/strings.xml new file mode 100644 index 0000000..e2c7ba3 --- /dev/null +++ b/WiFiLibrary/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + WiFiLibrary + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..28253d4 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + + defaultConfig { + applicationId "kong.qingwei.kqwwifimanagerdemo" + minSdkVersion 15 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + vectorDrawables.useSupportLibrary = true + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation project(':WiFiLibrary') + implementation 'com.android.support:appcompat-v7:25.2.0' + implementation 'com.android.support:design:25.2.0' + implementation 'com.android.support:support-v4:25.2.0' + implementation 'com.android.support:support-vector-drawable:25.2.0' + testImplementation 'junit:junit:4.13.2' + + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' + testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' + + implementation 'com.github.kongqw:PermissionsManager:2.3.1' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..41afecb --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in D:\Android\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0b6a3d7 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/ExampleApplication.java b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/ExampleApplication.java new file mode 100644 index 0000000..ca8347a --- /dev/null +++ b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/ExampleApplication.java @@ -0,0 +1,21 @@ +package kong.qingwei.kqwwifimanagerdemo; + +import android.app.Application; + +import com.squareup.leakcanary.LeakCanary; + +/** + * Created by kongqingwei on 2017/3/8. + * ExampleApplication + */ + +public class ExampleApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + if (LeakCanary.isInAnalyzerProcess(this)) { + return; + } + LeakCanary.install(this); + } +} diff --git a/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/MainActivity.java b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/MainActivity.java new file mode 100644 index 0000000..e20d949 --- /dev/null +++ b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/MainActivity.java @@ -0,0 +1,318 @@ +package kong.qingwei.kqwwifimanagerdemo; + +import android.Manifest; +import android.content.DialogInterface; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.SwitchCompat; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.CompoundButton; +import android.widget.FrameLayout; +import android.widget.ListView; +import android.widget.Toast; + +import com.kongqw.permissionslibrary.PermissionsManager; +import com.kongqw.wifilibrary.WiFiManager; +import com.kongqw.wifilibrary.listener.OnWifiConnectListener; +import com.kongqw.wifilibrary.listener.OnWifiEnabledListener; +import com.kongqw.wifilibrary.listener.OnWifiScanResultsListener; + +import java.util.List; + +import kong.qingwei.kqwwifimanagerdemo.adapter.WifiListAdapter; +import kong.qingwei.kqwwifimanagerdemo.view.ConnectWifiDialog; + +public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener, OnWifiScanResultsListener, OnWifiConnectListener, OnWifiEnabledListener { + + private static final String TAG = "MainActivity"; + + private ListView mWifiList; + private SwipeRefreshLayout mSwipeLayout; + private PermissionsManager mPermissionsManager; + + // 所需的全部权限 + static final String[] PERMISSIONS = new String[]{ + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + }; + private final int GET_WIFI_LIST_REQUEST_CODE = 0; + private WiFiManager mWiFiManager; + private WifiListAdapter mWifiListAdapter; + private SwitchCompat switchCompat; + private FrameLayout frameLayout; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + // 加载View + initView(); + // 添加WIFI开关的监听 + switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + mWiFiManager.openWiFi(); + } else { + mWiFiManager.closeWiFi(); + } + } + }); + // 添加下拉刷新的监听 + mSwipeLayout.setOnRefreshListener(this); + // 初始化WIFI列表 + mWifiList.setEmptyView(findViewById(R.id.empty_view)); + mWifiListAdapter = new WifiListAdapter(getApplicationContext()); + mWifiList.setAdapter(mWifiListAdapter); + mWifiList.setOnItemClickListener(this); + mWifiList.setOnItemLongClickListener(this); + // WIFI管理器 + mWiFiManager = WiFiManager.getInstance(getApplicationContext()); + // 动态权限管理器 + mPermissionsManager = new PermissionsManager(this) { + @Override + public void authorized(int requestCode) { + // 6.0 以上系统授权通过 + if (GET_WIFI_LIST_REQUEST_CODE == requestCode) { + // 获取WIFI列表 + List scanResults = mWiFiManager.getScanResults(); + refreshData(scanResults); + } + } + + @Override + public void noAuthorization(int requestCode, String[] lacksPermissions) { + // 6.0 以上系统授权失败 + } + + @Override + public void ignore() { + // 6.0 以下系统 获取WIFI列表 + List scanResults = mWiFiManager.getScanResults(); + refreshData(scanResults); + } + }; + // 请求WIFI列表 + mPermissionsManager.checkPermissions(GET_WIFI_LIST_REQUEST_CODE, PERMISSIONS); + } + + /** + * 初始化界面 + */ + private void initView() { + // WIFI 开关 + switchCompat = (SwitchCompat) findViewById(R.id.switch_wifi); + // 显示WIFI信息的布局 + frameLayout = (FrameLayout) findViewById(R.id.fl_wifi); + // 下拉刷新 + mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); + // WIFI列表 + mWifiList = (ListView) findViewById(R.id.wifi_list); + } + + @Override + protected void onResume() { + super.onResume(); + // 添加监听 + mWiFiManager.setOnWifiEnabledListener(this); + mWiFiManager.setOnWifiScanResultsListener(this); + mWiFiManager.setOnWifiConnectListener(this); + // 更新WIFI开关状态 + switchCompat.setChecked(mWiFiManager.isWifiEnabled()); + } + + @Override + protected void onPause() { + super.onPause(); + // 移除监听 + mWiFiManager.removeOnWifiEnabledListener(); + mWiFiManager.removeOnWifiScanResultsListener(); + mWiFiManager.removeOnWifiConnectListener(); + } + + /** + * 刷新页面 + * + * @param scanResults WIFI数据 + */ + public void refreshData(List scanResults) { + mSwipeLayout.setRefreshing(false); + // 刷新界面 + mWifiListAdapter.refreshData(scanResults); + + Snackbar.make(mWifiList, "WIFI列表刷新成功", Snackbar.LENGTH_SHORT).show(); + } + + /** + * Android 6.0 权限校验 + * + * @param requestCode requestCode + * @param permissions permissions + * @param grantResults grantResults + */ + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + // 复查权限 + mPermissionsManager.recheckPermissions(requestCode, permissions, grantResults); + } + + /** + * WIFI列表单击 + * + * @param parent parent + * @param view view + * @param position position + * @param id id + */ + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + final ScanResult scanResult = (ScanResult) mWifiListAdapter.getItem(position); + switch (mWiFiManager.getSecurityMode(scanResult)) { + case WPA: + case WPA2: + new ConnectWifiDialog(this) { + + @Override + public void connect(String password) { + mWiFiManager.connectWPA2Network(scanResult.SSID, password); + } + }.setSsid(scanResult.SSID).show(); + break; + case WEP: + new ConnectWifiDialog(this) { + + @Override + public void connect(String password) { + mWiFiManager.connectWEPNetwork(scanResult.SSID, password); + } + }.setSsid(scanResult.SSID).show(); + break; + case OPEN: // 开放网络 + mWiFiManager.connectOpenNetwork(scanResult.SSID); + break; + } + } + + /** + * WIFI列表长按 + * + * @param parent parent + * @param view view + * @param position position + * @param id id + * @return 是否拦截长按事件 + */ + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + ScanResult scanResult = (ScanResult) mWifiListAdapter.getItem(position); + final String ssid = scanResult.SSID; + new AlertDialog.Builder(this) + .setTitle(ssid) + .setItems(new String[]{"断开连接", "删除网络配置"}, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case 0: // 断开连接 + WifiInfo connectionInfo = mWiFiManager.getConnectionInfo(); + Log.i(TAG, "onClick: connectionInfo :" + connectionInfo.getSSID()); + if (mWiFiManager.addDoubleQuotation(ssid).equals(connectionInfo.getSSID())) { + mWiFiManager.disconnectWifi(connectionInfo.getNetworkId()); + } else { + Toast.makeText(getApplicationContext(), "当前没有连接 [ " + ssid + " ]", Toast.LENGTH_SHORT).show(); + } + break; + case 1: // 删除网络配置 + WifiConfiguration wifiConfiguration = mWiFiManager.getConfigFromConfiguredNetworksBySsid(ssid); + if (null != wifiConfiguration) { + boolean isDelete = mWiFiManager.deleteConfig(wifiConfiguration.networkId); + Toast.makeText(getApplicationContext(), isDelete ? "删除成功!" : "其他应用配置的网络没有ROOT权限不能删除!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(getApplicationContext(), "没有保存该网络!", Toast.LENGTH_SHORT).show(); + } + break; + default: + break; + } + } + }) + .show(); + return true; + } + + + /** + * 下拉刷新的回调 + */ + @Override + public void onRefresh() { + // 下拉刷新 + mWiFiManager.startScan(); + } + + /** + * WIFI列表刷新后的回调 + * + * @param scanResults 扫描结果 + */ + @Override + public void onScanResults(List scanResults) { + refreshData(scanResults); + } + + /** + * WIFI连接的Log得回调 + * + * @param log log + */ + @Override + public void onWiFiConnectLog(String log) { + Log.i(TAG, "onWiFiConnectLog: " + log); + Snackbar.make(mWifiList, "WIFI正在连接 : " + log, Snackbar.LENGTH_SHORT).show(); + } + + /** + * WIFI连接成功的回调 + * + * @param SSID 热点名 + */ + @Override + public void onWiFiConnectSuccess(String SSID) { + Log.i(TAG, "onWiFiConnectSuccess: [ " + SSID + " ] 连接成功"); + Toast.makeText(getApplicationContext(), SSID + " 连接成功", Toast.LENGTH_SHORT).show(); + } + + /** + * WIFI连接失败的回调 + * + * @param SSID 热点名 + */ + @Override + public void onWiFiConnectFailure(String SSID) { + Log.i(TAG, "onWiFiConnectFailure: [ " + SSID + " ] 连接失败"); + Toast.makeText(getApplicationContext(), SSID + " 连接失败!请重新连接!", Toast.LENGTH_SHORT).show(); + } + + /** + * WIFI开关状态的回调 + * + * @param enabled true 可用 false 不可用 + */ + @Override + public void onWifiEnabled(boolean enabled) { + switchCompat.setChecked(enabled); + frameLayout.setVisibility(enabled ? View.VISIBLE : View.GONE); + } +} diff --git a/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/adapter/WifiListAdapter.java b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/adapter/WifiListAdapter.java new file mode 100644 index 0000000..8fe1caf --- /dev/null +++ b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/adapter/WifiListAdapter.java @@ -0,0 +1,86 @@ +package kong.qingwei.kqwwifimanagerdemo.adapter; + +import android.content.Context; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiManager; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.kongqw.wifilibrary.WiFiManager; + +import java.util.ArrayList; +import java.util.List; + +import kong.qingwei.kqwwifimanagerdemo.R; + +/** + * Created by kqw on 2016/8/2. + * Wifi列表的数据适配器 + */ +public class WifiListAdapter extends BaseAdapter { + + private static final String TAG = "WifiListAdapter"; + private List scanResults; + private Context mContext; + + public WifiListAdapter(Context context) { + mContext = context.getApplicationContext(); + this.scanResults = new ArrayList<>(); + } + + public void refreshData(List scanResults) { + if (null != scanResults) { + Log.i(TAG, "refreshData 1 : " + scanResults.size()); + // 去重 + scanResults = WiFiManager.excludeRepetition(scanResults); + Log.i(TAG, "refreshData 2 : " + scanResults.size()); + // 清空数据 + this.scanResults.clear(); + // 更新数据 + this.scanResults.addAll(scanResults); + } + // 更新显示 + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return scanResults.size(); + } + + @Override + public Object getItem(int position) { + return scanResults.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder; + if (convertView == null) { + LayoutInflater layoutInflater = LayoutInflater.from(mContext); + convertView = layoutInflater.inflate(R.layout.item_wifi, null); + holder = new ViewHolder(); + holder.ssid = (TextView) (convertView).findViewById(R.id.ssid); + convertView.setTag(holder); + + } else { + holder = (ViewHolder) convertView.getTag(); + } + ScanResult scanResult = scanResults.get(position); + holder.ssid.setText("热点名称:" + scanResult.SSID + "\n信号强度:" + WifiManager.calculateSignalLevel(scanResult.level, 5) + "/5\n加密方式:" + scanResult.capabilities); + return convertView; + } + + private class ViewHolder { + private TextView ssid; + } +} diff --git a/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/view/ConnectWifiDialog.java b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/view/ConnectWifiDialog.java new file mode 100644 index 0000000..3d706fb --- /dev/null +++ b/app/src/main/java/kong/qingwei/kqwwifimanagerdemo/view/ConnectWifiDialog.java @@ -0,0 +1,76 @@ +package kong.qingwei.kqwwifimanagerdemo.view; + +import android.app.Dialog; +import android.content.Context; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import kong.qingwei.kqwwifimanagerdemo.R; + +/** + * Created by kongqingwei on 2017/2/20. + */ + +public abstract class ConnectWifiDialog extends Dialog implements View.OnClickListener { + + private EditText mEditTextPassword; + + public abstract void connect(String password); + + private TextView mTextViewSsid; + + public ConnectWifiDialog(Context context) { + super(context, R.style.ShareDialog); + initView(); + } + + private void initView() { + // 布局这里考虑只有分享到微信还有和朋友圈 所以没有用RecyclerView + View view = View.inflate(getContext().getApplicationContext(), R.layout.dialog_connect_wifi, null); + mTextViewSsid = (TextView) view.findViewById(R.id.tv_ssid); + mEditTextPassword = (EditText) view.findViewById(R.id.et_pwd); + Button mButtonCancel = (Button) view.findViewById(R.id.btn_cancel); + mButtonCancel.setOnClickListener(this); + Button mButtonConnect = (Button) view.findViewById(R.id.btn_connect); + mButtonConnect.setOnClickListener(this); + // 加载布局 + setContentView(view); + // 设置Dialog参数 + Window window = getWindow(); + WindowManager.LayoutParams params = window.getAttributes(); + params.width = WindowManager.LayoutParams.MATCH_PARENT; + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.gravity = Gravity.BOTTOM; + window.setAttributes(params); + } + + public ConnectWifiDialog setSsid(String ssid) { + mTextViewSsid.setText(ssid); + return this; + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_cancel: + + dismiss(); + break; + case R.id.btn_connect: + String pwd = mEditTextPassword.getText().toString(); + if (TextUtils.isEmpty(pwd)) { + + } else { + connect(pwd); + dismiss(); + } + break; + } + } +} diff --git a/app/src/main/res/anim/dialog_bottom_in.xml b/app/src/main/res/anim/dialog_bottom_in.xml new file mode 100644 index 0000000..95b10fd --- /dev/null +++ b/app/src/main/res/anim/dialog_bottom_in.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/dialog_bottom_out.xml b/app/src/main/res/anim/dialog_bottom_out.xml new file mode 100644 index 0000000..3f4ae35 --- /dev/null +++ b/app/src/main/res/anim/dialog_bottom_out.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..4a50786 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_connect_wifi.xml b/app/src/main/res/layout/dialog_connect_wifi.xml new file mode 100644 index 0000000..48d8a03 --- /dev/null +++ b/app/src/main/res/layout/dialog_connect_wifi.xml @@ -0,0 +1,46 @@ + + + + + + + + + +