本文實(shí)例講述了Android編程實(shí)現(xiàn)wifi掃描及連接的方法。分享給大家供大家參考,具體如下:
主界面,搜索附近WIFI信息
/** * Search WIFI and show in ListView * */public class MainActivity extends Activity implements OnClickListener, OnItemClickListener { private Button search_btn; private ListView wifi_lv; private WifiUtils mUtils; private List<String> result; private ProgressDialog progressdlg = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUtils = new WifiUtils(this); findViews(); setLiteners(); } private void findViews() { this.search_btn = (Button) findViewById(R.id.search_btn); this.wifi_lv = (ListView) findViewById(R.id.wifi_lv); } private void setLiteners() { search_btn.setOnClickListener(this); wifi_lv.setOnItemClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.search_btn) { showDialog(); new MyAsyncTask().execute(); } } /** * init dialog and show */ private void showDialog() { progressdlg = new ProgressDialog(this); progressdlg.setCanceledOnTouchOutside(false); progressdlg.setCancelable(false); progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressdlg.setMessage(getString(R.string.wait_moment)); progressdlg.show(); } /** * dismiss dialog */ private void progressDismiss() { if (progressdlg != null) { progressdlg.dismiss(); } } class MyAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... arg0) { //掃描附近WIFI信息 result = mUtils.getScanWifiResult(); return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); progressDismiss(); initListViewData(); } } private void initListViewData() { if (null != result && result.size() > 0) { wifi_lv.setAdapter(new ArrayAdapter<String>( getApplicationContext(), R.layout.wifi_list_item, R.id.ssid, result)); } else { wifi_lv.setEmptyView(findViewById(R.layout.list_empty)); } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { TextView tv = (TextView) arg1.findViewById(R.id.ssid); if (!TextUtils.isEmpty(tv.getText().toString())) { Intent in = new Intent(MainActivity.this, WifiConnectActivity.class); in.putExtra("ssid", tv.getText().toString()); startActivity(in); } }}/** * 連接指定的WIFI * */public class WifiConnectActivity extends Activity implements OnClickListener { private Button connect_btn; private TextView wifi_ssid_tv; private EditText wifi_pwd_tv; private WifiUtils mUtils; // wifi之ssid private String ssid; private String pwd; private ProgressDialog progressdlg = null; @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0: showToast("WIFI連接成功"); finish(); break; case 1: showToast("WIFI連接失敗"); break; } progressDismiss(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_connect); mUtils = new WifiUtils(this); findViews(); setLiteners(); initDatas(); } /** * init dialog */ private void progressDialog() { progressdlg = new ProgressDialog(this); progressdlg.setCanceledOnTouchOutside(false); progressdlg.setCancelable(false); progressdlg.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressdlg.setMessage(getString(R.string.wait_moment)); progressdlg.show(); } /** * dissmiss dialog */ private void progressDismiss() { if (progressdlg != null) { progressdlg.dismiss(); } } private void initDatas() { ssid = getIntent().getStringExtra("ssid"); if (!TextUtils.isEmpty(ssid)) { ssid = ssid.replace("/"", ""); } this.wifi_ssid_tv.setText(ssid); } private void findViews() { this.connect_btn = (Button) findViewById(R.id.connect_btn); this.wifi_ssid_tv = (TextView) findViewById(R.id.wifi_ssid_tv); this.wifi_pwd_tv = (EditText) findViewById(R.id.wifi_pwd_tv); } private void setLiteners() { connect_btn.setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.connect_btn) {// 下一步操作 pwd = wifi_pwd_tv.getText().toString(); // 判斷密碼輸入情況 if (TextUtils.isEmpty(pwd)) { Toast.makeText(this, "請(qǐng)輸入wifi密碼", Toast.LENGTH_SHORT).show(); return; } progressDialog(); // 在子線(xiàn)程中處理各種業(yè)務(wù) dealWithConnect(ssid, pwd); } } private void dealWithConnect(final String ssid, final String pwd) { new Thread(new Runnable() { @Override public void run() { Looper.prepare(); // 檢驗(yàn)密碼輸入是否正確 boolean pwdSucess = mUtils.connectWifiTest(ssid, pwd); try { Thread.sleep(4000); } catch (Exception e) { e.printStackTrace(); } if (pwdSucess) { mHandler.sendEmptyMessage(0); } else { mHandler.sendEmptyMessage(1); } } }).start(); } private void showToast(String str) { Toast.makeText(WifiConnectActivity.this, str, Toast.LENGTH_SHORT).show(); }}工具類(lèi):
public class WifiUtils { // 上下文Context對(duì)象 private Context mContext; // WifiManager對(duì)象 private WifiManager mWifiManager; public WifiUtils(Context mContext) { this.mContext = mContext; mWifiManager = (WifiManager) mContext .getSystemService(Context.WIFI_SERVICE); } /** * 判斷手機(jī)是否連接在Wifi上 */ public boolean isConnectWifi() { // 獲取ConnectivityManager對(duì)象 ConnectivityManager conMgr = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); // 獲取NetworkInfo對(duì)象 NetworkInfo info = conMgr.getActiveNetworkInfo(); // 獲取連接的方式為wifi State wifi = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI) .getState(); if (info != null && info.isAvailable() && wifi == State.CONNECTED) { return true; } else { return false; } } /** * 獲取當(dāng)前手機(jī)所連接的wifi信息 */ public WifiInfo getCurrentWifiInfo() { return mWifiManager.getConnectionInfo(); } /** * 添加一個(gè)網(wǎng)絡(luò)并連接 傳入?yún)?shù):WIFI發(fā)生配置類(lèi)WifiConfiguration */ public boolean addNetwork(WifiConfiguration wcg) { int wcgID = mWifiManager.addNetwork(wcg); return mWifiManager.enableNetwork(wcgID, true); } /** * 搜索附近的熱點(diǎn)信息,并返回所有熱點(diǎn)為信息的SSID集合數(shù)據(jù) */ public List<String> getScanWifiResult() { // 掃描的熱點(diǎn)數(shù)據(jù) List<ScanResult> resultList; // 開(kāi)始掃描熱點(diǎn) mWifiManager.startScan(); resultList = mWifiManager.getScanResults(); ArrayList<String> ssids = new ArrayList<String>(); if (resultList != null) { for (ScanResult scan : resultList) { ssids.add(scan.SSID);// 遍歷數(shù)據(jù),取得ssid數(shù)據(jù)集 } } return ssids; } /** * 連接wifi 參數(shù):wifi的ssid及wifi的密碼 */ public boolean connectWifiTest(final String ssid, final String pwd) { boolean isSuccess = false; boolean flag = false; mWifiManager.disconnect(); boolean addSucess = addNetwork(CreateWifiInfo(ssid, pwd, 3)); if (addSucess) { while (!flag && !isSuccess) { try { Thread.sleep(10000); } catch (InterruptedException e1) { e1.printStackTrace(); } String currSSID = getCurrentWifiInfo().getSSID(); if (currSSID != null) currSSID = currSSID.replace("/"", ""); int currIp = getCurrentWifiInfo().getIpAddress(); if (currSSID != null && currSSID.equals(ssid) && currIp != 0) { isSuccess = true; } else { flag = true; } } } return isSuccess; } /** * 創(chuàng)建WifiConfiguration對(duì)象 分為三種情況:1沒(méi)有密碼;2用wep加密;3用wpa加密 * * @param SSID * @param Password * @param Type * @return */ public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "/"" + SSID + "/""; WifiConfiguration tempConfig = this.IsExsits(SSID); if (tempConfig != null) { mWifiManager.removeNetwork(tempConfig.networkId); } if (Type == 1) // WIFICIPHER_NOPASS { config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if (Type == 2) // WIFICIPHER_WEP { config.hiddenSSID = true; config.wepKeys[0] = "/"" + 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; } if (Type == 3) // WIFICIPHER_WPA { config.preSharedKey = "/"" + Password + "/""; config.hiddenSSID = true; config.allowedAuthAlgorithms .set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.TKIP); // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } return config; } private WifiConfiguration IsExsits(String SSID) { List<WifiConfiguration> existingConfigs = mWifiManager .getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("/"" + SSID + "/"")) { return existingConfig; } } return null; }}― 主站蜘蛛池模板: 莱西市| 开化县| 阿图什市| 萍乡市| 封开县| 水富县| 巴东县| 汨罗市| 宾阳县| 亳州市| 呼图壁县| 蓬安县| 长阳| 和田县| 栾川县| 会理县| 原平市| 江北区| 木兰县| 宁都县| 雷州市| 张掖市| 石嘴山市| 凌源市| 锦州市| 苏尼特左旗| 朔州市| 安新县| 洛阳市| 昂仁县| 嘉祥县| 宜宾市| 贵德县| 宜宾县| 合肥市| 广宗县| 亚东县| 澄迈县| 建德市| 宝清县| 湖南省|