最近研究android内核-系统关键服务的启动解析,然而我也不知道研究wifi的作用,就当兴趣去做吧(其实是作业-_-)

系统原生WiFI功能大概有:启动WiFI服务,扫描WiFi信息(这个好像已经被封装到WiFiManager中了),显示WiFi,连接WiFi,关闭WiFi......

Android提供WifiManager.java对wifi进行管理

WifiInfo是专门用来表示连接的对象,可以查看当前已连接的wifi信息

WifiConfiguration是保存已配置过了wifi信息

ScanResult是存放扫描到了所有wifi的一些信息,如wifi名,信号强度,是否加锁。。。。

大体步骤:

Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象管理WIFI设备

WifiManager.startScan() 开始扫描

WifiManager.getScanResults() 获取扫描测试的结果

WifiManager.calculateSignalLevel(scanResult.get(i).level,4) 获取信号等级

scanResult.get(i).capabilities 获取wifi是否加锁

linkWifi.IsExsits(SSID) 获取wifi是否已保存配置信息

listView.setAdapter(adapter)显示wifi信息

监听事件处理

end

简单项目结构图

MScanWifi.java是我自己定义了一个Bean类只是定义了一些用到了wifi信息

package com.example.android_wifitest.base;import android.net.wifi.ScanResult;public class MScanWifi {private int level;//wifi信号强度private String WifiName;//保存一个引用,在wifi连接时候用到public ScanResult scanResult;private boolean isLock;//是否是锁定private boolean isExsit;//是否是保存过的wifipublic MScanWifi(){}public MScanWifi(ScanResult scanResult,String WifiName,int level,Boolean isLock){this.WifiName=WifiName;this.level=level;this.isLock=isLock;this.scanResult=scanResult;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}public String getWifiName() {return WifiName;}public void setWifiName(String wifiName) {WifiName = wifiName;}public Boolean getIsLock() {return isLock;}public void setIsLock(boolean isLock) {this.isLock = isLock;}public boolean getIsExsit() {return isExsit;}public void setIsExsit(boolean isExsit) {this.isExsit = isExsit;}}

View Code

LinkWifi.java这个封装了一些常用方法(这个类从其他人代码中copy)

package com.example.android_wifitest;import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;import android.app.Service;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.util.Log;public class LinkWifi {private WifiManager wifiManager;private Context context;/** 定义几种加密方式,一种是WEP,一种是WPA/WPA2,还有没有密码的情况 */public enum WifiCipherType {WIFI_CIPHER_WEP, WIFI_CIPHER_WPA_EAP, WIFI_CIPHER_WPA_PSK, WIFI_CIPHER_WPA2_PSK, WIFI_CIPHER_NOPASS}public LinkWifi(Context context) {this.context = context;wifiManager = (WifiManager) context.getSystemService(Service.WIFI_SERVICE);}public boolean ConnectToNetID(int netID) {System.out.println("ConnectToNetID netID=" + netID);return wifiManager.enableNetwork(netID, true);}public int CreateWifiInfo2(ScanResult wifiinfo, String pwd) {WifiCipherType type;if (wifiinfo.capabilities.contains("WPA2-PSK")) {// WPA-PSK加密type = WifiCipherType.WIFI_CIPHER_WPA2_PSK;} else if (wifiinfo.capabilities.contains("WPA-PSK")) {// WPA-PSK加密type = WifiCipherType.WIFI_CIPHER_WPA_PSK;} else if (wifiinfo.capabilities.contains("WPA-EAP")) {// WPA-EAP加密type = WifiCipherType.WIFI_CIPHER_WPA_EAP;} else if (wifiinfo.capabilities.contains("WEP")) {// WEP加密type = WifiCipherType.WIFI_CIPHER_WEP;} else {// 无密码type = WifiCipherType.WIFI_CIPHER_NOPASS;}WifiConfiguration config = CreateWifiInfo(wifiinfo.SSID,wifiinfo.BSSID, pwd, type);if (config != null) {return wifiManager.addNetwork(config);} else {return -1;}}/** 配置一个连接 */public WifiConfiguration CreateWifiInfo(String SSID, String BSSID,String password, WifiCipherType type) {int priority;WifiConfiguration config = this.IsExsits(SSID);if (config != null) {// Log.w("Wmt", "####之前配置过这个网络,删掉它");// wifiManager.removeNetwork(config.networkId); // 如果之前配置过这个网络,删掉它// 本机之前配置过此wifi热点,调整优先级后,直接返回return setMaxPriority(config);}config = new WifiConfiguration();/* 清除之前的连接信息 */config.allowedAuthAlgorithms.clear();config.allowedGroupCiphers.clear();config.allowedKeyManagement.clear();config.allowedPairwiseCiphers.clear();config.allowedProtocols.clear();config.SSID = "\"" + SSID + "\"";config.status = WifiConfiguration.Status.ENABLED;// config.BSSID = BSSID;// config.hiddenSSID = true;
priority = getMaxPriority() + 1;if (priority > 99999) {priority = shiftPriorityAndSave();}config.priority = priority; // 2147483647;/* 各种加密方式判断 */if (type == WifiCipherType.WIFI_CIPHER_NOPASS) {Log.w("Wmt", "没有密码");config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;} else if (type == WifiCipherType.WIFI_CIPHER_WEP) {Log.w("Wmt", "WEP加密,密码" + password);config.preSharedKey = "\"" + password + "\"";config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);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;} else if (type == WifiCipherType.WIFI_CIPHER_WPA_EAP) {Log.w("Wmt", "WPA_EAP加密,密码" + password);config.preSharedKey = "\"" + password + "\"";config.hiddenSSID = true;config.status = WifiConfiguration.Status.ENABLED;config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);config.allowedProtocols.set(WifiConfiguration.Protocol.RSN| WifiConfiguration.Protocol.WPA);} else if (type == WifiCipherType.WIFI_CIPHER_WPA_PSK) {Log.w("Wmt", "WPA加密,密码" + password);config.preSharedKey = "\"" + password + "\"";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.allowedProtocols.set(WifiConfiguration.Protocol.RSN| WifiConfiguration.Protocol.WPA);} else if (type == WifiCipherType.WIFI_CIPHER_WPA2_PSK) {Log.w("Wmt", "WPA2-PSK加密,密码=======" + password);config.preSharedKey = "\"" + password + "\"";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.allowedProtocols.set(WifiConfiguration.Protocol.RSN);config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);} else {return null;}return config;}/** 查看以前是否也配置过这个网络 */public WifiConfiguration IsExsits(String SSID) {List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();for (WifiConfiguration existingConfig : existingConfigs) {if (existingConfig.SSID.toString().equals("\"" + SSID + "\"")) {return existingConfig;}}return null;}public WifiConfiguration setMaxPriority(WifiConfiguration config) {int priority = getMaxPriority() + 1;if (priority > 99999) {priority = shiftPriorityAndSave();}config.priority = priority; // 2147483647;System.out.println("priority=" + priority);wifiManager.updateNetwork(config);// 本机之前配置过此wifi热点,直接返回return config;}private int getMaxPriority() {List<WifiConfiguration> localList = this.wifiManager.getConfiguredNetworks();int i = 0;Iterator<WifiConfiguration> localIterator = localList.iterator();while (true) {if (!localIterator.hasNext())return i;WifiConfiguration localWifiConfiguration = (WifiConfiguration) localIterator.next();if (localWifiConfiguration.priority <= i)continue;i = localWifiConfiguration.priority;}}private int shiftPriorityAndSave() {List<WifiConfiguration> localList = this.wifiManager.getConfiguredNetworks();sortByPriority(localList);int i = localList.size();for (int j = 0;; ++j) {if (j >= i) {this.wifiManager.saveConfiguration();return i;}WifiConfiguration localWifiConfiguration = (WifiConfiguration) localList.get(j);localWifiConfiguration.priority = j;this.wifiManager.updateNetwork(localWifiConfiguration);}}private void sortByPriority(List<WifiConfiguration> paramList) {Collections.sort(paramList, new WifiManagerCompare());}class WifiManagerCompare implements Comparator<WifiConfiguration> {public int compare(WifiConfiguration paramWifiConfiguration1,WifiConfiguration paramWifiConfiguration2) {return paramWifiConfiguration1.priority- paramWifiConfiguration2.priority;}}
}

View Code

上主代码之前先上xml布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:background="#cccccc"><TextView android:id="@+id/switch_txt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="关"/><!--wifi开关按钮--><Switchandroid:id="@+id/switch_status"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textOff="OFF"android:textOn="ON"android:thumb="@drawable/thumb_selector"android:track="@drawable/track_selector" /></LinearLayout>
<LinearLayout android:id="@+id/ListView_LinearLayout"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:background="#000000">
</LinearLayout></LinearLayout>

View Code

<LinearLayout android:id="@+id/ListView_LinearLayout"。。。这个是为了加载listview准备了

android:thumb="@drawable/thumb_selector" thumb属性指的是:switch上面滑动的滑块

android:track="@drawable/track_selector"  track是滑道德背景图片显示

上面的两个资源文件

thumb_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"  android:drawable="@drawable/press" /><item android:state_pressed="false" android:drawable="@drawable/switch_enable"/>
</selector>

View Code

track_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true" android:drawable="@drawable/switch_track_default"/><item android:state_checked="false" android:drawable="@drawable/switch_check_on"/>
</selector>

View Code

my_listview.xml这是为了实现动态加载XML布局使用

<?xml version="1.0" encoding="utf-8"?><ListViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/mlistview"android:divider="#cccccc"android:dividerHeight="1dp"android:layout_width="fill_parent"android:layout_height="fill_parent"/>

View Code

listitems.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#666666"android:orientation="horizontal" ><ImageViewandroid:id="@+id/img_wifi_level"android:layout_width="wrap_content"android:layout_height="30dp"android:contentDescription="@string/hello_world"android:layout_marginLeft="20dp"android:src="@drawable/wifi_signal" /><LinearLayoutandroid:layout_toRightOf="@id/img_wifi_level"android:layout_height="30dp"android:layout_width="wrap_content"android:layout_marginLeft="20dp"android:orientation="vertical" ><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="left"android:textSize="12sp"android:textStyle="bold"android:text="11111"/><TextViewandroid:id="@+id/tv2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="left"android:textSize="12sp"android:visibility="gone"android:text="11111"/></LinearLayout>
</RelativeLayout>

View Code

dialog_inputpwd.xml弹出对话框显示的Content

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><LinearLayoutandroid:id="@+id/dialognum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:id="@+id/tvPassWord"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:text="密码:"android:textColor="#19B2CC" /><EditTextandroid:id="@+id/etPassWord"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minWidth="200dip"android:password="true" /></LinearLayout></RelativeLayout>

View Code

MainActivity.java是程序入口(有点累赘了)

  1 package com.example.android_wifitest;
  2
  3 import android.os.Bundle;
  4 import android.os.Handler;
  5 import android.os.Message;
  6 import android.util.Log;
  7
  8 import java.lang.ref.WeakReference;
  9 import java.util.ArrayList;
 10 import java.util.List;
 11
 12 import com.example.android_wifitest.base.CommonAdapter;
 13 import com.example.android_wifitest.base.MScanWifi;
 14 import com.example.android_wifitest.base.ViewHolder;
 15
 16 import android.app.Activity;
 17 import android.app.AlertDialog;
 18 import android.app.Service;
 19 import android.content.BroadcastReceiver;
 20 import android.content.Context;
 21 import android.content.DialogInterface;
 22 import android.content.Intent;
 23 import android.content.IntentFilter;
 24 import android.net.wifi.ScanResult;
 25 import android.net.wifi.WifiConfiguration;
 26 import android.net.wifi.WifiManager;
 27 import android.view.LayoutInflater;
 28 import android.view.Menu;
 29 import android.view.View;
 30 import android.widget.AdapterView;
 31 import android.widget.AdapterView.OnItemClickListener;
 32 import android.widget.CompoundButton;
 33 import android.widget.EditText;
 34 import android.widget.LinearLayout;
 35 import android.widget.ListView;
 36 import android.widget.Switch;
 37 import android.widget.TextView;
 38 import android.widget.CompoundButton.OnCheckedChangeListener;
 39
 40 public class MainActivity extends Activity {
 41     public WifiManager mWifiManager;
 42     public List<MScanWifi> mScanWifiList;//自定义类存放用到的wifi信息
 43     public List<ScanResult> mWifiList;//存放系统扫描到了wifi信息
 44     public List<WifiConfiguration> mWifiConfiguration;//wifi配置信息
 45     public Context context = null;
 46     public Scanner mScanner;//自定义handler类每隔10秒自动扫描wifi信息
 47     public View view;
 48     public TextView wifi_status_txt;
 49     public Switch wifiSwitch;
 50     public ListView listView;
 51     private IntentFilter mFilter;
 52     private LinkWifi linkWifi;
 53     public LayoutInflater Inflater;
 54     private LinearLayout layout;
 55
 56     @Override
 57     protected void onCreate(Bundle savedInstanceState) {
 58         super.onCreate(savedInstanceState);
 59         setContentView(R.layout.activity_main);
 60         context=this;
 61         Inflater=LayoutInflater.from(context);
 62         mWifiManager=(WifiManager) context.getSystemService(Service.WIFI_SERVICE);
 63         mScanner = new Scanner(this);
 64         linkWifi=new LinkWifi(context);
 65         initView();
 66         initIntentFilter();
 67         registerListener();
 68         registerBroadcast();
 69     }
 70     public void initIntentFilter() {
 71         // TODO Auto-generated method stub
 72         mFilter = new IntentFilter();
 73         mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
 74         mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
 75     }
 76     @Override
 77     protected void onResume() {
 78         // TODO Auto-generated method stub
 79         super.onResume();
 80         //用户操作activity时更新UI
 81         mScanner.forceScan();
 82     }
 83     /*@Override
 84     protected void onPause() {
 85         // TODO Auto-generated method stub
 86         super.onPause();
 87         //设备激进入休眠状态时执行
 88         unregisterBroadcast();
 89     }*/
 90     @Override
 91     protected void onDestroy() {
 92         super.onDestroy();
 93         context.unregisterReceiver(mReceiver); // 注销此广播接收器
 94     }
 95     public void initView() {
 96         // TODO Auto-generated method stub
 97         //获得要加载listview的布局
 98         layout=(LinearLayout) findViewById(R.id.ListView_LinearLayout);
 99         //动态获得listview布局
100          listView = (ListView) Inflater.inflate(
101                 R.layout.my_listview, null).findViewById(R.id.mlistview);
102         wifi_status_txt=(TextView) findViewById(R.id.switch_txt);
103         wifiSwitch=(Switch)findViewById(R.id.switch_status);
104         layout.addView(listView);
105     }
106     public void registerListener() {
107         // TODO Auto-generated method stub
108         wifiSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
109
110             @Override
111             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
112                 // TODO Auto-generated method stub
113                 if (buttonView.isChecked()){
114                     wifi_status_txt.setText("开启");
115
116                     if (!mWifiManager.isWifiEnabled()) { // 当前wifi不可用
117                         mWifiManager.setWifiEnabled(true);
118                     }
119                     mWifiManager.startScan();
120
121                 }
122                 else{
123                     wifi_status_txt.setText("关闭");
124                     if (mWifiManager.isWifiEnabled()) {
125                         mWifiManager.setWifiEnabled(false);
126                     }
127
128                 }
129             }
130         });
131         //给item添加监听事件
132         listView.setOnItemClickListener(new OnItemClickListener() {
133
134             @Override
135             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
136                 // TODO Auto-generated method stub
137                 // 本机已经配置过的wifi
138                 final ScanResult wifi=mScanWifiList.get(position).scanResult;
139                 final WifiConfiguration wifiConfig=linkWifi.IsExsits(wifi.SSID);
140                 if(wifiConfig!= null){
141                     final int netID = wifiConfig.networkId;
142                     String actionStr;
143                     // 如果目前连接了此网络
144                     if (mWifiManager.getConnectionInfo().getNetworkId() == netID) {
145                         actionStr = "断开";
146                     } else {
147                         actionStr = "连接";
148                     }
149                     android.app.AlertDialog.Builder builder=new AlertDialog.Builder(context);
150                             builder.setTitle("提示");
151                             builder.setMessage("请选择你要进行的操作?");
152                             builder.setPositiveButton(actionStr,
153                             new DialogInterface.OnClickListener() {
154                                 public void onClick(DialogInterface dialog,
155                                         int whichButton) {
156
157                                     if (mWifiManager.getConnectionInfo()
158                                             .getNetworkId() == netID) {
159                                         mWifiManager.disconnect();
160                                     } else {
161
162                                         linkWifi.setMaxPriority(wifiConfig);
163                                         linkWifi.ConnectToNetID(wifiConfig.networkId);
164                                     }
165
166                                 }
167                             });
168                             builder.setNeutralButton("忘记",
169                             new DialogInterface.OnClickListener() {
170                                 public void onClick(DialogInterface dialog,
171                                         int whichButton) {
172                                     mWifiManager.removeNetwork(netID);
173                                     return;
174                                 }
175                             });
176                             builder.setNegativeButton("取消",
177                             new DialogInterface.OnClickListener() {
178                                 public void onClick(DialogInterface dialog,
179                                         int whichButton) {
180                                     return;
181                                 }
182                             });
183                             builder.show();
184
185             return;
186
187                 }
188                 if (mScanWifiList.get(position).getIsLock()) {
189                     // 有密码,提示输入密码进行连接
190
191                     // final String encryption = capabilities;
192
193                     LayoutInflater factory = LayoutInflater.from(context);
194                     final View inputPwdView = factory.inflate(R.layout.dialog_inputpwd,
195                             null);
196                     new AlertDialog.Builder(context)
197                             .setTitle("请输入该无线的连接密码")
198                             .setMessage("无线SSID:" + wifi.SSID)
199                             .setIcon(android.R.drawable.ic_dialog_info)
200                             .setView(inputPwdView)
201                             .setPositiveButton("确定",
202                                     new DialogInterface.OnClickListener() {
203                                         public void onClick(DialogInterface dialog,
204                                                 int which) {
205                                             EditText pwd = (EditText) inputPwdView
206                                                     .findViewById(R.id.etPassWord);
207                                             String wifipwd = pwd.getText().toString();
208
209                                             // 此处加入连接wifi代码
210                                             int netID = linkWifi.CreateWifiInfo2(
211                                                     wifi, wifipwd);
212
213                                             linkWifi.ConnectToNetID(netID);
214                                         }
215                                     })
216                             .setNegativeButton("取消",
217                                     new DialogInterface.OnClickListener() {
218                                         @Override
219                                         public void onClick(DialogInterface dialog,
220                                                 int which) {
221                                         }
222                                     }).setCancelable(false).show();
223
224                 } else {
225                     // 无密码
226                     new AlertDialog.Builder(context)
227                             .setTitle("提示")
228                             .setMessage("你选择的wifi无密码,可能不安全,确定继续连接?")
229                             .setPositiveButton("确定",
230                                     new DialogInterface.OnClickListener() {
231                                         public void onClick(DialogInterface dialog,
232                                                 int whichButton) {
233
234                                             // 此处加入连接wifi代码
235                                             int netID = linkWifi.CreateWifiInfo2(
236                                                     wifi, "");
237
238                                             linkWifi.ConnectToNetID(netID);
239                                         }
240                                     })
241                             .setNegativeButton("取消",
242                                     new DialogInterface.OnClickListener() {
243                                         public void onClick(DialogInterface dialog,
244                                                 int whichButton) {
245                                             return;
246                                         }
247                                     }).show();
248
249                 }
250
251             }
252
253         });
254     }
255
256     /**
257      * 获取到自定义的ScanResult
258      **/
259     public void initScanWifilist(){
260         MScanWifi mScanwifi;
261         mScanWifiList=new ArrayList<MScanWifi>();
262         for(int i=0; i<mWifiList.size();i++){
263             int level=WifiManager.calculateSignalLevel(mWifiList.get(i).level,4);
264             String mwifiName=mWifiList.get(i).SSID;
265             boolean boolean1=false;
266             if(mWifiList.get(i).capabilities.contains("WEP")||mWifiList.get(i).capabilities.contains("PSK")||
267                     mWifiList.get(i).capabilities.contains("EAP")){
268                 boolean1=true;
269             }else{
270                 boolean1=false;
271             }
272             mScanwifi=new MScanWifi(mWifiList.get(i),mwifiName,level,boolean1);
273             if(linkWifi.IsExsits(mwifiName)!=null){
274                 mScanwifi.setIsExsit(true);
275                 }
276             else {mScanwifi.setIsExsit(false);
277                 }
278             mScanWifiList.add(mScanwifi);
279         }
280     }

281     public void registerBroadcast() {
282         context.registerReceiver(mReceiver, mFilter);
283     }
284     public void unregisterBroadcast(){
285         context.unregisterReceiver(mReceiver);
286     }
287
288     /**
289      * 广播接收,监听网络
290      */
291     private BroadcastReceiver mReceiver = new BroadcastReceiver() {
292
293         @Override
294         public void onReceive(Context context, Intent intent) {
295             handleEvent(context, intent);
296         }
297     };
298     public void handleEvent(Context context, Intent intent) {
299         // TODO Auto-generated method stub
300         final String action = intent.getAction();
301         // wifi状态发生改变。
302         if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION))
303         {
304             /*int wifiState = intent.getIntExtra(
305                     WifiManager.EXTRA_WIFI_STATE, 0);*/
306             int wifiState=intent.getIntExtra(
307                     WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
308             updateWifiStateChanged(wifiState);
309         }
310         else if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
311             updateWifiList();
312
313         }
314     }
315     /**
316      * 更新WiFi列表UI
317      **/
318     public void updateWifiList(){
319
320         final int wifiState = mWifiManager.getWifiState();
321         //获取WiFi列表并显示
322         switch (wifiState) {
323         case WifiManager.WIFI_STATE_ENABLED:
324             //wifi处于开启状态
325             initWifiData();
326             listView.setAdapter(new CommonAdapter<MScanWifi>(context,
327                     mScanWifiList,R.layout.listitems) {
328                 @Override
329                 public void convert(ViewHolder helper, MScanWifi item) {
330                     // TODO Auto-generated method stub
331                     helper.setText(R.id.tv1, item.getWifiName());
332                     //Log.i("1111111", item.getWifiName()+"是否开放"+item.getIsLock());
333                     if(item.getIsLock()){
334                         helper.setImageResource(R.id.img_wifi_level, R.drawable.wifi_signal_lock, item.getLevel());
335                     }else
336                         {helper.setImageResource(R.id.img_wifi_level, R.drawable.wifi_signal_open, item.getLevel());
337                         }
338                     if(item.getIsExsit()){
339                         TextView view=helper.getView(R.id.tv2);
340                         view.setText("已保存");
341                         view.setVisibility(View.VISIBLE);
342                     }
343                 }
344                 });
345             break;
346         case WifiManager.WIFI_STATE_ENABLING:
347             listView.setAdapter(null);
348             break;//如果WiFi处于正在打开的状态,则清除列表
349         }
350     }
351     /**
352      * 初始化wifi信息
353      * mWifiList和mWifiConfiguration
354      **/
355     public void initWifiData() {
356         // TODO Auto-generated method stub
357         mWifiList=mWifiManager.getScanResults();
358         mWifiConfiguration=mWifiManager.getConfiguredNetworks();
359         initScanWifilist();
360     }
361     private void updateWifiStateChanged(int state) {
362         switch (state) {
363             case WifiManager.WIFI_STATE_ENABLING://正在打开WiFi
364                 wifiSwitch.setEnabled(false);
365                 Log.i("aaaaaa", "正在打开WiFi");
366                 break;
367             case WifiManager.WIFI_STATE_ENABLED://WiFi已经打开
368                 //setSwitchChecked(true);
369                 wifiSwitch.setEnabled(true);
370                 wifiSwitch.setChecked(true);
371                 layout.removeAllViews();
372                 layout.addView(listView);
373                 mScanner.resume();
374                 Log.i("aaaaaa", "WiFi已经打开");
375                 break;
376             case WifiManager.WIFI_STATE_DISABLING://正在关闭WiFi
377                 wifiSwitch.setEnabled(false);
378                 Log.i("aaaaaa", "正在关闭WiFi");
379                 break;
380             case WifiManager.WIFI_STATE_DISABLED://WiFi已经关闭
381                 //setSwitchChecked(false);
382                 wifiSwitch.setEnabled(true);
383                 wifiSwitch.setChecked(false);
384                 layout.removeAllViews();
385                 Log.i("aaaaaa", "WiFi已经关闭  ");
386                 break;
387             default:
388                 //setSwitchChecked(false);
389                 wifiSwitch.setEnabled(true);
390                 break;
391         }
392         mScanner.pause();//移除message通知
393     }
394     @Override
395     public boolean onCreateOptionsMenu(Menu menu) {
396         // Inflate the menu; this adds items to the action bar if it is present.
397         getMenuInflater().inflate(R.menu.main, menu);
398         return true;
399     }
400     /**
401      * 这个类使用startScan()方法开始扫描wifi
402      * WiFi扫描结束时系统会发送该广播,
403      * 用户可以监听该广播通过调用WifiManager
404      * 的getScanResults方法来获取到扫描结果
405      * @author zwh
406      *
407      */
408     public static class Scanner extends Handler {
409         private final WeakReference<MainActivity> mActivity;
410         private int mRetry = 0;
411         public Scanner(MainActivity activity){
412             mActivity = new WeakReference<MainActivity>(activity);
413         }
414         void resume(){
415             if (!hasMessages(0)) {
416                 sendEmptyMessage(0);
417             }
418         }
419
420         void forceScan() {
421             removeMessages(0);
422             sendEmptyMessage(0);
423         }
424
425         void pause() {
426             mRetry = 0;
427             removeMessages(0);
428         }
429
430         @Override
431         public void handleMessage(Message message) {
432             if (mActivity.get().mWifiManager.startScan()) {
433                 mRetry = 0;
434             } else if (++mRetry >= 3) {
435                 mRetry = 0;
436                 return;
437             }
438             sendEmptyMessageDelayed(0, 10*1000);//10s后再次发送message
439         }
440     }
441
442 }

CommonAdapter.java和ViewHolder.java是关于ListView适配器部分

项目总结:

  这里不得不说下,我代码可读性真的太差了,一个MainActivity代码那么多,bug还有一大堆没有处理,而且这个switch要限定我的这个apkminSdkVersion="14"手机版本至少14以上,还有弹出对话框其实可以修改成新建一个dialog类减少MainActivity代码达到代码复用。但这些不影响基本功能使用,学到了一些没有接触过了。如判别wifi是否加开放

item.getIsLock()如果开放显示无锁的wifi信号强度否则相反

显示不同wifi信号强度

如开关切换-样式变化

动态加载xml布局addView(),哦!还有一点改善之处,在非UI线程进行数据处理,当数据处理完后发送消息给ui线程进行数据显示这个不知道可不可以(纸上谈兵)

缺点处处可见,不要介意欢迎提出宝贵意见

源码下载wifiTest

转载于:https://www.cnblogs.com/gne-hwz/p/6688603.html

android学习-仿Wifi模块实现相关推荐

  1. android 4.4 wifi 模块开发总结(电视盒子)

    最近6.0的盒子的应用开发已经告一段落了,接到的新需求就是想办法让公司以前发出去的4.4的盒子也得兼容应用.把应用装到4.4盒子上,发现也就文件读取,网络(有线无线),蓝牙,恢复出厂设置这几个模块不能 ...

  2. android EasyLink给wifi模块配网

    相关文章 博客 http://blog.csdn.net/u010924834/article/details/49491349 本文使用的是庆科wifi模块 http://developer.mic ...

  3. Android学习笔记-Wifi网络操作

    Wifi网卡状态 WIFI_STATE_DISABLED Wifi网卡不可用 WIFI_STATE_DIABLING Wifi网卡正在关闭 WIFI_STATE_ENABLED Wifi网卡可用 WI ...

  4. Android学习笔记--WIFI的操作

    MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1 . 什么是WIFI WIFI就是一种无线联网的技术 , 则又称为"热 ...

  5. android wifi模块分析

    声明:本文纯属网上资料收集,版权归源作者所有,转载时请标明为转载文章 现在对android平台的wifi模块了解了一段时间,现在做一些简要总结,以便以后查阅和与修正,上正文. [Wifi模块学习流程] ...

  6. Wifi模块—源码分析Wifi热点扫描(Android P)

    一 前言 这次接着讲Wifi工程流程中的Wifi热点查找过程,也是Wifi启动的过程延续,Wifi启动过程中会更新Wifi的状态,框架层也有相应广播发出,应用层接收到广播后开始进行热点的扫描.可以先看 ...

  7. ESP8266 WIFI模块学习之路(7)——自写Android手机APP接受单片机数据

    上一篇是写关于自写Android手机APP给单片机下发数据的,这次我将写一下APP如何接受单片机数据. 其实使用调试助手,或者别人开的的APP同样能够实现接受单片机数据,但想学习的,我还是建议能够自己 ...

  8. Android Studio设计APP实现与51单片机通过WIFI模块(ESP8266-01S)通讯控制LED灯亮灭的设计源码【详解】

    目录 一.前言 二.效果展示 1.APP界面展示 2.C51硬件展示 三.Android Studio APP源代码 1.AndroidManifest.xml 1.请求联网: 2.开放明文传输: 2 ...

  9. ESP8266 WIFI模块学习之路(2)——模块与单片机连接进行远程操作

    上一个博客:ESP8266 WIFI模块学习之路(1)是关于对串口连接的,简单验证ESP8266是怎么样连接及其功能验证,下面将通过单片机连接,和手机进行远程操作. ESP8266和单片机的连接,我这 ...

最新文章

  1. 我圣贤为何发起第三方插件商店和桌面应用商店?
  2. mysql外键约束脚本_如何在MySQL中设置外键约束
  3. 几周内搞定Java的10个方法
  4. 【报告】2014年移动端二次元用户调查报告:进击的90后
  5. 一个编程指南还有这么多道道儿?
  6. Flash 声音频谱图一
  7. linux tar 命令无效,linux Tar 命令
  8. AI语音技术的应用与发展前景
  9. rockchip eDP 配置
  10. Minimum supported Gradle version is 4.10.1. Current version is 4.6.
  11. 计组(六)流水线技术
  12. Qt无边框窗体实现方案
  13. C++ snippets
  14. mongodb-更新操作符
  15. selenium被检测
  16. Java jdk 环境配置
  17. 程序员V.S.编程语言:你上“贼船”了吗?
  18. 个性化个人主页html5模板
  19. grub for dos 入门
  20. python制作软件界面_Python图形界面GUI程序设计

热门文章

  1. python结束多线程_如何中断/停止/结束挂起的多线程python程序
  2. 【HDOJ7059】Counting Stars(线段树,区间加,乘,标记)
  3. php和其他语言的区别,为什么说php是弱类型好学,跟其他语言的区别
  4. load dll failed java_【软件安装故障排除】安装完PyCharm,启动时弹出Failed to load JVM DLL\bin\server\jvm.dll解决方案...
  5. JavaScript循环结构(1)
  6. 2018CCPC网络赛 HDU 6444: G. Neko's loop(线段树)
  7. Wannafly交流赛1: C. 腰带图(瞎搞)
  8. bzoj 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(暴力)
  9. bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍
  10. python机器学习案例系列教程——决策树(ID3、C4.5、CART)