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();