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/)
![第一勺金](https://upload-images.jianshu.io/upload_images/5415899-fcb0f0ad7b8e1df9.jpg)
适配android6.0 获取wifi 列表,连接wifi ## 效果图 ![](https://github.com/GuoZhaoHui628/WifiListConnect/blob/master/QQ%E6%88%AA%E5%9B%BE20171127182222.png) ![](https://github.com/GuoZhaoHui628/WifiListConnect/blob/master/device-2017-11-27-181017.gif) ## 详情 [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 ================================================