Repository: GuoZhaoHui628/WifiListConnect
Branch: master
Commit: 49173657a939
Files: 38
Total size: 63.1 KB
Directory structure:
gitextract_qc8r63kf/
├── .gitignore
├── .idea/
│ ├── compiler.xml
│ ├── copyright/
│ │ └── profiles_settings.xml
│ ├── gradle.xml
│ ├── inspectionProfiles/
│ │ ├── Project_Default.xml
│ │ └── profiles_settings.xml
│ ├── misc.xml
│ ├── modules.xml
│ ├── runConfigurations.xml
│ ├── smartfox_info.xml
│ └── vcs.xml
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── guo/
│ │ └── wifilistconnect/
│ │ └── ExampleInstrumentedTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── guo/
│ │ │ └── wifilistconnect/
│ │ │ ├── MainActivity.java
│ │ │ ├── WifiSupport.java
│ │ │ ├── adapter/
│ │ │ │ └── WifiListAdapter.java
│ │ │ ├── app/
│ │ │ │ └── AppContants.java
│ │ │ ├── bean/
│ │ │ │ └── WifiBean.java
│ │ │ ├── dialog/
│ │ │ │ └── WifiLinkDialog.java
│ │ │ └── utils/
│ │ │ └── CollectionUtils.java
│ │ └── res/
│ │ ├── layout/
│ │ │ ├── activity_main.xml
│ │ │ ├── item_wifi_list.xml
│ │ │ └── setting_wifi_link_dialog.xml
│ │ └── values/
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test/
│ └── java/
│ └── guo/
│ └── wifilistconnect/
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild
================================================
FILE: .idea/compiler.xml
================================================
================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
================================================
FILE: .idea/gradle.xml
================================================
================================================
FILE: .idea/inspectionProfiles/Project_Default.xml
================================================
================================================
FILE: .idea/inspectionProfiles/profiles_settings.xml
================================================
================================================
FILE: .idea/misc.xml
================================================
Android API 22 Platform
================================================
FILE: .idea/modules.xml
================================================
================================================
FILE: .idea/runConfigurations.xml
================================================
================================================
FILE: .idea/smartfox_info.xml
================================================
================================================
FILE: .idea/vcs.xml
================================================
================================================
FILE: README.md
================================================
# WifiListConnect
定期分享国内外别人家技术赚钱的案例,希望能给你启发。可以关注一波 保证不坑,坑了取消就是啦 :)
### 最新分享
【案例】这些日赚上万美金Youtube油管从业者 技术人的福音 https://www.jianshu.com/p/18a25b4dcd40
【案例】FFMPEG大神的机会 一套油管自动生产视频赚钱方法详解 [https://guozh.net/anlibierenmai1000daoyitaoyouguanzidongshengchanshipinzhuanqian/](https://guozh.net/anlibierenmai1000daoyitaoyouguanzidongshengchanshipinzhuanqian/)
【案例】FFMPEG GIF音乐搞笑视频自动生成 内含视频体验 [https://guozh.net/youtube-funny-gif-auto-product-make-money/](https://guozh.net/youtube-funny-gif-auto-product-make-money/)

适配android6.0 获取wifi 列表,连接wifi
## 效果图


## 详情
[csdn博客](http://blog.csdn.net/guozhaohui628/article/details/78644150)
如果帮到你了给个star支持下,谢谢了
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "guo.wifilistconnect"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support:recyclerview-v7:24.1.1'
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\MyDownLoad\as\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 *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: app/src/androidTest/java/guo/wifilistconnect/ExampleInstrumentedTest.java
================================================
package guo.wifilistconnect;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see Testing documentation
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("guo.wifilistconnect", appContext.getPackageName());
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
================================================
FILE: app/src/main/java/guo/wifilistconnect/MainActivity.java
================================================
package guo.wifilistconnect;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
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.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import guo.wifilistconnect.adapter.WifiListAdapter;
import guo.wifilistconnect.app.AppContants;
import guo.wifilistconnect.bean.WifiBean;
import guo.wifilistconnect.dialog.WifiLinkDialog;
import guo.wifilistconnect.utils.CollectionUtils;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
//权限请求码
private static final int PERMISSION_REQUEST_CODE = 0;
//两个危险权限需要动态申请
private static final String[] NEEDED_PERMISSIONS = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
};
private boolean mHasPermission;
ProgressBar pbWifiLoading;
List realWifiList = new ArrayList<>();
private WifiListAdapter adapter;
private RecyclerView recyWifiList;
private WifiBroadcastReceiver wifiReceiver;
private int connectType = 0;//1:连接成功? 2 正在连接(如果wifi热点列表发生变需要该字段)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pbWifiLoading = (ProgressBar) this.findViewById(R.id.pb_wifi_loading);
hidingProgressBar();
mHasPermission = checkPermission();
if (!mHasPermission && WifiSupport.isOpenWifi(MainActivity.this)) { //未获取权限,申请权限
requestPermission();
}else if(mHasPermission && WifiSupport.isOpenWifi(MainActivity.this)){ //已经获取权限
initRecycler();
}else{
Toast.makeText(MainActivity.this,"WIFI处于关闭状态",Toast.LENGTH_SHORT).show();
}
}
private void initRecycler() {
recyWifiList = (RecyclerView) this.findViewById(R.id.recy_list_wifi);
adapter = new WifiListAdapter(this,realWifiList);
recyWifiList.setLayoutManager(new LinearLayoutManager(this));
recyWifiList.setAdapter(adapter);
if(WifiSupport.isOpenWifi(MainActivity.this) && mHasPermission){
sortScaResult();
}else{
Toast.makeText(MainActivity.this,"WIFI处于关闭状态或权限获取失败22222",Toast.LENGTH_SHORT).show();
}
adapter.setOnItemClickListener(new WifiListAdapter.onItemClickListener() {
@Override
public void onItemClick(View view, int postion, Object o) {
WifiBean wifiBean = realWifiList.get(postion);
if(wifiBean.getState().equals(AppContants.WIFI_STATE_UNCONNECT) || wifiBean.getState().equals(AppContants.WIFI_STATE_CONNECT)){
String capabilities = realWifiList.get(postion).getCapabilities();
if(WifiSupport.getWifiCipher(capabilities) == WifiSupport.WifiCipherType.WIFICIPHER_NOPASS){//无需密码
WifiConfiguration tempConfig = WifiSupport.isExsits(wifiBean.getWifiName(),MainActivity.this);
if(tempConfig == null){
WifiConfiguration exsits = WifiSupport.createWifiConfig(wifiBean.getWifiName(), null, WifiSupport.WifiCipherType.WIFICIPHER_NOPASS);
WifiSupport.addNetWork(exsits, MainActivity.this);
}else{
WifiSupport.addNetWork(tempConfig, MainActivity.this);
}
}else{ //需要密码,弹出输入密码dialog
noConfigurationWifi(postion);
}
}
}
});
}
private void noConfigurationWifi(int position) {//之前没配置过该网络, 弹出输入密码界面
WifiLinkDialog linkDialog = new WifiLinkDialog(this,R.style.dialog_download,realWifiList.get(position).getWifiName(), realWifiList.get(position).getCapabilities());
if(!linkDialog.isShowing()){
linkDialog.show();
}
}
@Override
protected void onResume() {
super.onResume();
//注册广播
wifiReceiver = new WifiBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);//监听wifi是开关变化的状态
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//监听wifi连接状态广播,是否连接了一个有效路由
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);//监听wifi列表变化(开启一个热点或者关闭一个热点)
this.registerReceiver(wifiReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
this.unregisterReceiver(wifiReceiver);
}
//监听wifi状态
public class WifiBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())){
int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
switch (state){
/**
* WIFI_STATE_DISABLED WLAN已经关闭
* WIFI_STATE_DISABLING WLAN正在关闭
* WIFI_STATE_ENABLED WLAN已经打开
* WIFI_STATE_ENABLING WLAN正在打开
* WIFI_STATE_UNKNOWN 未知
*/
case WifiManager.WIFI_STATE_DISABLED:{
Log.d(TAG,"已经关闭");
Toast.makeText(MainActivity.this,"WIFI处于关闭状态",Toast.LENGTH_SHORT).show();
break;
}
case WifiManager.WIFI_STATE_DISABLING:{
Log.d(TAG,"正在关闭");
break;
}
case WifiManager.WIFI_STATE_ENABLED:{
Log.d(TAG,"已经打开");
sortScaResult();
break;
}
case WifiManager.WIFI_STATE_ENABLING:{
Log.d(TAG,"正在打开");
break;
}
case WifiManager.WIFI_STATE_UNKNOWN:{
Log.d(TAG,"未知状态");
break;
}
}
}else if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Log.d(TAG, "--NetworkInfo--" + info.toString());
if(NetworkInfo.State.DISCONNECTED == info.getState()){//wifi没连接上
Log.d(TAG,"wifi没连接上");
hidingProgressBar();
for(int i = 0;i < realWifiList.size();i++){//没连接上将 所有的连接状态都置为“未连接”
realWifiList.get(i).setState(AppContants.WIFI_STATE_UNCONNECT);
}
adapter.notifyDataSetChanged();
}else if(NetworkInfo.State.CONNECTED == info.getState()){//wifi连接上了
Log.d(TAG,"wifi连接上了");
hidingProgressBar();
WifiInfo connectedWifiInfo = WifiSupport.getConnectedWifiInfo(MainActivity.this);
//连接成功 跳转界面 传递ip地址
Toast.makeText(MainActivity.this,"wifi连接上了",Toast.LENGTH_SHORT).show();
connectType = 1;
wifiListSet(connectedWifiInfo.getSSID(),connectType);
}else if(NetworkInfo.State.CONNECTING == info.getState()){//正在连接
Log.d(TAG,"wifi正在连接");
showProgressBar();
WifiInfo connectedWifiInfo = WifiSupport.getConnectedWifiInfo(MainActivity.this);
connectType = 2;
wifiListSet(connectedWifiInfo.getSSID(),connectType );
}
}else if(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())){
Log.d(TAG,"网络列表变化了");
wifiListChange();
}
}
}
/**
* //网络状态发生改变 调用此方法!
*/
public void wifiListChange(){
sortScaResult();
WifiInfo connectedWifiInfo = WifiSupport.getConnectedWifiInfo(this);
if(connectedWifiInfo != null){
wifiListSet(connectedWifiInfo.getSSID(),connectType);
}
}
/**
* 将"已连接"或者"正在连接"的wifi热点放置在第一个位置
* @param wifiName
* @param type
*/
public void wifiListSet(String wifiName , int type){
int index = -1;
WifiBean wifiInfo = new WifiBean();
if(CollectionUtils.isNullOrEmpty(realWifiList)){
return;
}
for(int i = 0;i < realWifiList.size();i++){
realWifiList.get(i).setState(AppContants.WIFI_STATE_UNCONNECT);
}
Collections.sort(realWifiList);//根据信号强度排序
for(int i = 0;i < realWifiList.size();i++){
WifiBean wifiBean = realWifiList.get(i);
if(index == -1 && ("\"" + wifiBean.getWifiName() + "\"").equals(wifiName)){
index = i;
wifiInfo.setLevel(wifiBean.getLevel());
wifiInfo.setWifiName(wifiBean.getWifiName());
wifiInfo.setCapabilities(wifiBean.getCapabilities());
if(type == 1){
wifiInfo.setState(AppContants.WIFI_STATE_CONNECT);
}else{
wifiInfo.setState(AppContants.WIFI_STATE_ON_CONNECTING);
}
}
}
if(index != -1){
realWifiList.remove(index);
realWifiList.add(0, wifiInfo);
adapter.notifyDataSetChanged();
}
}
/**
* 检查是否已经授予权限
* @return
*/
private boolean checkPermission() {
for (String permission : NEEDED_PERMISSIONS) {
if (ActivityCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 申请权限
*/
private void requestPermission() {
ActivityCompat.requestPermissions(this,
NEEDED_PERMISSIONS, PERMISSION_REQUEST_CODE);
}
/**
* 获取wifi列表然后将bean转成自己定义的WifiBean
*/
public void sortScaResult(){
List scanResults = WifiSupport.noSameName(WifiSupport.getWifiScanResult(this));
realWifiList.clear();
if(!CollectionUtils.isNullOrEmpty(scanResults)){
for(int i = 0;i < scanResults.size();i++){
WifiBean wifiBean = new WifiBean();
wifiBean.setWifiName(scanResults.get(i).SSID);
wifiBean.setState(AppContants.WIFI_STATE_UNCONNECT); //只要获取都假设设置成未连接,真正的状态都通过广播来确定
wifiBean.setCapabilities(scanResults.get(i).capabilities);
wifiBean.setLevel(WifiSupport.getLevel(scanResults.get(i).level)+"");
realWifiList.add(wifiBean);
//排序
Collections.sort(realWifiList);
adapter.notifyDataSetChanged();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean hasAllPermission = true;
if (requestCode == PERMISSION_REQUEST_CODE) {
for (int i : grantResults) {
if (i != PackageManager.PERMISSION_GRANTED) {
hasAllPermission = false; //判断用户是否同意获取权限
break;
}
}
//如果同意权限
if (hasAllPermission) {
mHasPermission = true;
if(WifiSupport.isOpenWifi(MainActivity.this) && mHasPermission){ //如果wifi开关是开 并且 已经获取权限
initRecycler();
}else{
Toast.makeText(MainActivity.this,"WIFI处于关闭状态或权限获取失败1111",Toast.LENGTH_SHORT).show();
}
} else { //用户不同意权限
mHasPermission = false;
Toast.makeText(MainActivity.this,"获取权限失败",Toast.LENGTH_SHORT).show();
}
}
}
public void showProgressBar() {
pbWifiLoading.setVisibility(View.VISIBLE);
}
public void hidingProgressBar() {
pbWifiLoading.setVisibility(View.GONE);
}
}
================================================
FILE: app/src/main/java/guo/wifilistconnect/WifiSupport.java
================================================
package guo.wifilistconnect;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
import guo.wifilistconnect.bean.WifiBean;
/**
* Created by ${GuoZhaoHui} on 2017/11/27.
* Email:guozhaohui628@gmail.com
*/
public class WifiSupport {
private static final String TAG = "WifiSupport";
public enum WifiCipherType {
WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
}
public WifiSupport() {
}
public static List getWifiScanResult(Context context) {
boolean b = context == null;
return ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)).getScanResults();
}
public static boolean isWifiEnable(Context context) {
return ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)).isWifiEnabled();
}
public static WifiInfo getConnectedWifiInfo(Context context) {
return ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)).getConnectionInfo();
}
public static List getConfigurations(Context context) {
return ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)).getConfiguredNetworks();
}
public static WifiConfiguration createWifiConfig(String SSID, String password, WifiCipherType type) {
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + SSID + "\"";
if (type == WifiCipherType.WIFICIPHER_NOPASS) {
// config.wepKeys[0] = ""; //注意这里
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
// config.wepTxKeyIndex = 0;
}
if (type == WifiCipherType.WIFICIPHER_WEP) {
config.preSharedKey = "\"" + password + "\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if (type == WifiCipherType.WIFICIPHER_WPA) {
config.preSharedKey = "\"" + password + "\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
}
return config;
}
/**
* 接入某个wifi热点
*/
public static boolean addNetWork(WifiConfiguration config, Context context) {
WifiManager wifimanager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiinfo = wifimanager.getConnectionInfo();
if (null != wifiinfo) {
wifimanager.disableNetwork(wifiinfo.getNetworkId());
}
boolean result = false;
if (config.networkId > 0) {
result = wifimanager.enableNetwork(config.networkId, true);
wifimanager.updateNetwork(config);
} else {
int i = wifimanager.addNetwork(config);
result = false;
if (i > 0) {
wifimanager.saveConfiguration();
return wifimanager.enableNetwork(i, true);
}
}
return result;
}
/**
* 判断wifi热点支持的加密方式
*/
public static WifiCipherType getWifiCipher(String s) {
if (s.isEmpty()) {
return WifiCipherType.WIFICIPHER_INVALID;
} else if (s.contains("WEP")) {
return WifiCipherType.WIFICIPHER_WEP;
} else if (s.contains("WPA") || s.contains("WPA2") || s.contains("WPS")) {
return WifiCipherType.WIFICIPHER_WPA;
} else {
return WifiCipherType.WIFICIPHER_NOPASS;
}
}
//查看以前是否也配置过这个网络
public static WifiConfiguration isExsits(String SSID, Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List existingConfigs = wifimanager.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs) {
if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
return existingConfig;
}
}
return null;
}
// 打开WIFI
public static void openWifi(Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (!wifimanager.isWifiEnabled()) {
wifimanager.setWifiEnabled(true);
}
}
// 关闭WIFI
public static void closeWifi(Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifimanager.isWifiEnabled()) {
wifimanager.setWifiEnabled(false);
}
}
public static boolean isOpenWifi(Context context){
WifiManager wifimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
boolean b = wifimanager.isWifiEnabled();
return b;
}
/**
* 将idAddress转化成string类型的Id字符串
*
* @param idString
* @return
*/
public static String getStringId(int idString) {
StringBuffer sb = new StringBuffer();
int b = (idString >> 0) & 0xff;
sb.append(b + ".");
b = (idString >> 8) & 0xff;
sb.append(b + ".");
b = (idString >> 16) & 0xff;
sb.append(b + ".");
b = (idString >> 24) & 0xff;
sb.append(b);
return sb.toString();
}
/**
* 设置安全性
*
* @param capabilities
* @return
*/
public static String getCapabilitiesString(String capabilities) {
if (capabilities.contains("WEP")) {
return "WEP";
} else if (capabilities.contains("WPA") || capabilities.contains("WPA2") || capabilities.contains("WPS")) {
return "WPA/WPA2";
} else {
return "OPEN";
}
}
public static boolean getIsWifiEnabled(Context context) {
WifiManager wifimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
return wifimanager.isWifiEnabled();
}
public static void getReplace(Context context, List list) {
WifiInfo wifi = WifiSupport.getConnectedWifiInfo(context);
List listCopy = new ArrayList<>();
listCopy.addAll(list);
for (int i = 0; i < list.size(); i++) {
if (("\"" + list.get(i).getWifiName() + "\"").equals(wifi.getSSID())) {
listCopy.add(0, list.get(i));
listCopy.remove(i + 1);
listCopy.get(0).setState("已连接");
}
}
list.clear();
list.addAll(listCopy);
}
/**
* 去除同名WIFI
*
* @param oldSr 需要去除同名的列表
* @return 返回不包含同命的列表
*/
public static List noSameName(List oldSr)
{
List newSr = new ArrayList();
for (ScanResult result : oldSr)
{
if (!TextUtils.isEmpty(result.SSID) && !containName(newSr, result.SSID))
newSr.add(result);
}
return newSr;
}
/**
* 判断一个扫描结果中,是否包含了某个名称的WIFI
* @param sr 扫描结果
* @param name 要查询的名称
* @return 返回true表示包含了该名称的WIFI,返回false表示不包含
*/
public static boolean containName(List sr, String name)
{
for (ScanResult result : sr)
{
if (!TextUtils.isEmpty(result.SSID) && result.SSID.equals(name))
return true;
}
return false;
}
/**
* 返回level 等级
*/
public static int getLevel(int level){
if (Math.abs(level) < 50) {
return 1;
} else if (Math.abs(level) < 75) {
return 2;
} else if (Math.abs(level) < 90) {
return 3;
} else {
return 4;
}
}
}
================================================
FILE: app/src/main/java/guo/wifilistconnect/adapter/WifiListAdapter.java
================================================
package guo.wifilistconnect.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import guo.wifilistconnect.R;
import guo.wifilistconnect.app.AppContants;
import guo.wifilistconnect.bean.WifiBean;
/**
* Created by ${GuoZhaoHui} on 2017/11/7.
* Email:guozhaohui628@gmail.com
*/
public class WifiListAdapter extends RecyclerView.Adapter {
private Context mContext;
private List resultList;
private onItemClickListener onItemClickListener;
public void setOnItemClickListener(WifiListAdapter.onItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public WifiListAdapter(Context mContext, List resultList) {
this.mContext = mContext;
this.resultList = resultList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_wifi_list, parent, false);
MyViewHolder vh = new MyViewHolder(view);
return vh;
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
final WifiBean bean = resultList.get(position);
holder.tvItemWifiName.setText(bean.getWifiName());
holder.tvItemWifiStatus.setText("("+bean.getState()+")");
//可以传递给adapter的数据都是经过处理的,已连接或者正在连接状态的wifi都是处于集合中的首位,所以可以写出如下判断
if(position == 0 && (AppContants.WIFI_STATE_ON_CONNECTING.equals(bean.getState()) || AppContants.WIFI_STATE_CONNECT.equals(bean.getState()))){
holder.tvItemWifiName.setTextColor(mContext.getResources().getColor(R.color.homecolor1));
holder.tvItemWifiStatus.setTextColor(mContext.getResources().getColor(R.color.homecolor1));
}else{
holder.tvItemWifiName.setTextColor(mContext.getResources().getColor(R.color.gray_home));
holder.tvItemWifiStatus.setTextColor(mContext.getResources().getColor(R.color.gray_home));
}
holder.itemview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onItemClick(view,position,bean);
}
});
}
public void replaceAll(List datas) {
if (resultList.size() > 0) {
resultList.clear();
}
resultList.addAll(datas);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return resultList.size();
}
static class MyViewHolder extends RecyclerView.ViewHolder{
View itemview;
TextView tvItemWifiName, tvItemWifiStatus;
public MyViewHolder(View itemView) {
super(itemView);
itemview = itemView;
tvItemWifiName = (TextView) itemView.findViewById(R.id.tv_item_wifi_name);
tvItemWifiStatus = (TextView) itemView.findViewById(R.id.tv_item_wifi_status);
}
}
public interface onItemClickListener{
void onItemClick(View view, int postion, Object o);
}
}
================================================
FILE: app/src/main/java/guo/wifilistconnect/app/AppContants.java
================================================
package guo.wifilistconnect.app;
/**
* Created by ${GuoZhaoHui} on 2017/11/27.
* Email:guozhaohui628@gmail.com
*/
public class AppContants {
public static final String WIFI_STATE_CONNECT = "已连接";
public static final String WIFI_STATE_ON_CONNECTING = "正在连接";
public static final String WIFI_STATE_UNCONNECT = "未连接";
}
================================================
FILE: app/src/main/java/guo/wifilistconnect/bean/WifiBean.java
================================================
package guo.wifilistconnect.bean;
/**
* Created by John on 2017/4/7.
*/
public class WifiBean implements Comparable {
private String wifiName;
private String level;
private String state; //已连接 正在连接 未连接 三种状态
private String capabilities;//加密方式
@Override
public String toString() {
return "WifiBean{" +
"wifiName='" + wifiName + '\'' +
", level='" + level + '\'' +
", state='" + state + '\'' +
", capabilities='" + capabilities + '\'' +
'}';
}
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 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(this.getLevel());
int level2 = Integer.parseInt(o.getLevel());
return level1 - level2;
}
}
================================================
FILE: app/src/main/java/guo/wifilistconnect/dialog/WifiLinkDialog.java
================================================
package guo.wifilistconnect.dialog;
import android.app.Dialog;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import guo.wifilistconnect.MainActivity;
import guo.wifilistconnect.R;
import guo.wifilistconnect.WifiSupport;
/**
* Created by John on 2017/4/7.
*/
public class WifiLinkDialog extends Dialog implements View.OnClickListener{
private TextView text_name;
private EditText password_edit;
private Button cancel_button;
private Button cofirm_button;
private String text_nameString = null;
private String capabilities;
private Context mContext;
public WifiLinkDialog(@NonNull Context context, @StyleRes int themeResId, String text_nameString, String capabilities) {
super(context, themeResId);
this.text_nameString = text_nameString;
this.capabilities = capabilities;
mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = LayoutInflater.from(mContext).inflate(R.layout.setting_wifi_link_dialog, null);
setContentView(view);
initView(view);
text_name.setText(text_nameString);
initListener();
}
private void initListener() {
cancel_button.setOnClickListener(this);
cofirm_button.setOnClickListener(this);
password_edit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if((capabilities.contains("WPA") || capabilities.contains("WPA2") || capabilities.contains("WPS"))){
if(password_edit.getText() == null && password_edit.getText().toString().length() < 8){
cofirm_button.setClickable(false);
}else{
cofirm_button.setClickable(true);
}
}else if(capabilities.contains("WEP")){
if(password_edit.getText() == null && password_edit.getText().toString().length() < 8){
cofirm_button.setClickable(false);
}else{
cofirm_button.setClickable(true);
}
}
}
});
}
private void initView(View view) {
text_name = (TextView) view.findViewById(R.id.wifi_title);
password_edit = (EditText) view.findViewById(R.id.password_edit);
cancel_button = (Button) view.findViewById(R.id.cancel_button);
cofirm_button = (Button)view.findViewById(R.id.cofirm_button);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.cofirm_button:{
WifiConfiguration tempConfig = WifiSupport.isExsits(text_nameString,getContext());
if(tempConfig == null){
WifiConfiguration wifiConfiguration = WifiSupport.createWifiConfig(text_nameString,password_edit.getText().toString(),WifiSupport.getWifiCipher(capabilities));
WifiSupport.addNetWork(wifiConfiguration,getContext());
}else{
WifiSupport.addNetWork(tempConfig,getContext());
}
dismiss();
break;
}
case R.id.cancel_button:{
dismiss();
break;
}
}
}
}
================================================
FILE: app/src/main/java/guo/wifilistconnect/utils/CollectionUtils.java
================================================
package guo.wifilistconnect.utils;
import java.util.Collection;
/**
* 集合操作工具类
*/
public class CollectionUtils {
/**
* 判断集合是否为null或者0个元素
*
* @param c
* @return
*/
public static boolean isNullOrEmpty(Collection c) {
if (null == c || c.isEmpty()) {
return true;
}
return false;
}
}
================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
================================================
FILE: app/src/main/res/layout/item_wifi_list.xml
================================================
================================================
FILE: app/src/main/res/layout/setting_wifi_link_dialog.xml
================================================
================================================
FILE: app/src/main/res/values/colors.xml
================================================
#3F51B5
#303F9F
#FF4081
#F8F8F8
#909090
#FFFFFFFF
#1a5cc0
#FF5722
#484848
================================================
FILE: app/src/main/res/values/strings.xml
================================================
WifiListConnect
================================================
FILE: app/src/main/res/values/styles.xml
================================================
================================================
FILE: app/src/test/java/guo/wifilistconnect/ExampleUnitTest.java
================================================
package guo.wifilistconnect;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see Testing documentation
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Mon Nov 27 11:24:26 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
================================================
FILE: gradlew
================================================
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: settings.gradle
================================================
include ':app'