筆記83 | wifi解析使用

Author:Even

1. WifiManager

WifiManager是管理android WIFI的連接服務,它可以配置WIFI網絡連接,管理當前wifi連接,掃描接入點,監視wifi連接狀態;

使用必需加權限:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
         <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

使用getSystemService方法訪問

private static WifiManager wifiManager;
String wifiService = getActivity().WIFI_SERVICE;
wifiManager = (WifiManager) getActivity().getSystemService(wifiService);

2. wifi開關

wifiManager.setWifiEnabled(isChecked);

3. 監聽wifi連接狀態

註冊廣播:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
getActivity().registerReceiver(receiver, intentFilter);

監聽:

/*

          * 監聽wifi狀態

          */

         private BroadcastReceiver receiver = new BroadcastReceiver() {

               @Override

               public void onReceive(Context context, Intent intent) {

                    final String action = intent.getAction();

                    if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {

                         Log.i(TAG,"接入點掃描已經完成,從懇求者那裏可以得到結果");

                    } else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {

                         int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);

                         switch (wifiState) {

                         case WifiManager.WIFI_STATE_ENABLED:

                               Log.i(TAG,"獲取到wifi開啓的廣播時,開始掃描");

                               break;

                         case WifiManager.WIFI_STATE_DISABLED:

                               Log.i(TAG,"wifi關閉發出的廣播");

                               break;

                         }

                    }else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {

                         /*

                          * 顯示Wi-Fi連接狀態改變的廣播意圖動作

                          */

                         NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

                         if (info.getState().equals(NetworkInfo.State.DISCONNECTED)) {

                               Log.i(TAG,"連接已斷開");

                         }

                         else if (info.getState().equals(NetworkInfo.State.CONNECTED)) {

                               Log.i("AAA","已連接");

                         } else {

                               NetworkInfo.DetailedState state = info.getDetailedState();

                               if (state == state.CONNECTING) {

                                    Log.i("AAA","連接中...");

                               } else if (state == state.AUTHENTICATING) {

                                    Log.i("AAA","正在驗證身份信息...");

                               } else if (state == state.OBTAINING_IPADDR) {

                                    Log.i("AAA","正在獲取IP地址...");

                               } else if (state == state.FAILED) {

                                    Log.i("AAA","連接失敗");

                               }

                         }

                    }

                    else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { //查看wifi是否在連接狀態

                         if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) {

                               Log.i("AAA","查看wifi是否在連接狀態  "+false);

                         } else {

                               Log.i("AAA","查看wifi是否在連接狀態  "+true);

                         }

                    }

               }

         };

我們拿到wifi的狀態就可以做很多事了

4. 拿到掃描的wifi列表

首先要搜一下wifi信號

/*

          * 搜索wifi熱點

          */

         private void search() {

               wifiManager.startScan();

         }

存放在list中

List<ScanResult> scanResults;
scanResults = wifiManager.getScanResults();

拿到wifi列表它就任你怎麼玩了 --

一般而言,你打印就知道,你拿的wifi信號會發現有些是重複的,這是因爲把 SSID和BSSI的wifi信號全部掃描出來了,你這個時候,就可以使用這個方法過濾一遍保留ssid

/*

          * 以 SSID 爲關鍵字,過濾掉信號弱和重複wifi選項

          */

         public static List<ScanResult> filterScanResult(final List<ScanResult> list) {

               WifiInfo wifiInfo = wifiManager.getConnectionInfo();

               LinkedHashMap<String, ScanResult> linkedMap = new LinkedHashMap<>(list.size());

               for (ScanResult rst : list) {

                    if (linkedMap.containsKey(rst.SSID)) {

                         if (rst.level > linkedMap.get(rst.SSID).level ) {

                               linkedMap.put(rst.SSID, rst);

                         }

                         continue;

                    }

                    linkedMap.put(rst.SSID, rst);

               }

               list.clear();

               list.addAll(linkedMap.values());

               return list;

         }

5.加載到listview中

拿好了wifi列表就可以寫一個adapter加載到listview中了

/*

          * wifi列表的加載器

          */

         public class WifiListAdapter extends ArrayAdapter<ScanResult> {

               private final LayoutInflater mInflater;

               private int mResource;

               public WifiListAdapter(Context context, int resource) {

                    super(context, resource);

                    mInflater = LayoutInflater.from(context);

                    mResource = resource;

               }

               @Override

               public View getView(int position, View convertView, ViewGroup parent) {

                    if (convertView == null) {

                         convertView = mInflater.inflate(mResource, parent, false);

                    }

                    TextView name = (TextView) convertView.findViewById(R.id.wifi_name);

                    ScanResult scanResult = getItem(position);

                    name.setText(scanResult.SSID);

                    return convertView;

               }

         }

6. 獲取信號的強弱,是否加密

在加載adapter的時候,可以去獲取對應信號的很多信息,包括一些地址,類別,信號強弱,是否需要密碼等等

信號強弱

ScanResult scanResult = getItem(position);

                    int level = scanResult.level;

                    if (level <= 0 && level >= -50) {

                         signl.setBackgroundResource(R.drawable.icon_wifi_level4); 

                    } else if (level < -50 && level >= -70) {

                         signl.setBackgroundResource(R.drawable.icon_wifi_level3);

                    } else if (level < -70 && level >= -80) {

                         signl.setBackgroundResource(R.drawable.icon_wifi_level2);

                    } else if (level < -80 && level >= -100) {

                         signl.setBackgroundResource(R.drawable.icon_wifi_level1);

                    }

是否加密

ScanResult scanResult = getItem(position);

                    String capabilities = scanResult.capabilities;

                    if (!TextUtils.isEmpty(capabilities)) {

                         if (capabilities.contains("WPA") || capabilities.contains("wpa")) {

                              //wpa類型密碼

                         } else if (capabilities.contains("WEP") || capabilities.contains("wep")) {

                               //wep類型密碼

                         } else {

                             //無密碼

                               type = WIFICIPHER_NOPASS;

                         }

                    }

7. 連接wifi

首先我們要判斷指定的wifi信號是否有保存密碼

/*

          * 判斷當前wifi是否有保存

          */

         private WifiConfiguration config;

         private WifiConfiguration isExsits(String SSID) {

               List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();

               for (WifiConfiguration existingConfig : existingConfigs) {

                    if (existingConfig.SSID.equals("\"" + SSID + "\"")) {

                         return existingConfig;

                    }

               }

               return null;

         }

        。。。

         /*

          * 彈出帶editText的AlertDialog框,獲取輸入的密碼

          */

                if (config == null) {

                       if (type != WIFICIPHER_NOPASS) {//需要密碼

                               final EditText editText = new EditText(getActivity());

                               final int finalType = type;

                               new AlertDialog.Builder(getActivity()).setTitle(

                                         getResources().getString(R.string.enter_wifi)).setIcon(

                                         android.R.drawable.ic_dialog_info).setView(

                                                    editText).setPositiveButton(

                                                               getResources().getString(R.string.confirm),

                                                               new DialogInterface.OnClickListener() {

                                                         @Override

                                                         public void onClick(DialogInterface dialog, int which) {

                                                               config = createWifiInfo(scanResult.SSID, editText.getText().toString(), finalType);

                                                               connect(config,position);

                                                         }

                                                    })

                                                    .setNegativeButton(getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {

                                                         @Override

                                                         public void onClick(DialogInterface dialog, int which) {

                                                         }

                                                    }).show();

                               return;

                         } else {

                               config = createWifiInfo(scanResult.SSID, "", type);

                               connect(config,position);

                         }

        。。。

         /*

          * 連接的方法

          */

         private int wcgID;

         private void connect(WifiConfiguration config,int position) {

               Visible_cur_wifi_view(true);

               wcgID = wifiManager.addNetwork(config);

               wifiManager.enableNetwork(wcgID, true);

         }

8. 忘記密碼

/*

          * 傳入對應的wifi的ssid

            忘卻密碼的方法

          */

         public void removeWifi_si(String charSequence){

               List<WifiConfiguration> wifiConfigurations = wifiManager.getConfiguredNetworks();

               //忘卻wifi密碼

               for (WifiConfiguration wifiConfig : wifiConfigurations) {

                    String ssid = wifiConfig.SSID;

                    if (ssid.substring(1, ssid.length() - 1).equals(charSequence)) {

                         wifiManager.removeNetwork(wifiConfig.networkId);

                         wifiManager.saveConfiguration();

                    }

               }

         }

9. 斷開wifi信號

wifiManager.disconnect();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章