android连接wifi代码

来源:互联网 发布:网络系统集成建设方案 编辑:程序博客网 时间:2024/05/20 16:00
package com.pingyijinren.common.util.network;import java.util.ArrayList;import java.util.Collection;import java.util.List;import java.util.Queue;import com.pingyijinren.guider.Constants;import com.pingyijinren.guider.GuideApplication;import android.content.Context;import android.net.wifi.ScanResult;import android.net.wifi.SupplicantState;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.net.wifi.WifiManager.ActionListener;import android.os.AsyncTask;import android.text.TextUtils;import android.util.ArrayMap;import android.util.Log;/**本地的wifi工具类<br> * 调用步骤<br> * 1 startScan() * 2 getLocalScanResults() * 3 connect() *  * 如果连接失败 * 4 disconnect() *  *  * @author WenYF * */public class WifiTool {private static final String TAG = "WifiTool";private WifiManager nWifiManager;private List<ScanResult> nWifiScanList;private ArrayList<LocalScanResult> nLocalScanResults;private Collection<WifiListener> nWifiListeners;public void addScanStateListener(WifiListener listener) {nWifiListeners.add(listener);}public void removeScanStateListener(WifiListener listener) {nWifiListeners.remove(listener);}private AsyncTask<String, Integer, String> nScanTask;private boolean nIsDestory;private boolean nIsStopScan;private boolean nIsStopConnect;public WifiTool(Context context) {nIsStopConnect = true;nIsDestory = false;nIsStopScan = true;nWifiListeners = new ArrayList<WifiTool.WifiListener>();nLocalScanResults = new ArrayList<LocalScanResult>();nWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);nWifiScanList = null;}/** * 注销工具 */public void destory() {stopScan();nIsDestory = true;nLocalScanResults.clear();nWifiListeners.clear();}/** * 关闭WIFI */public void closeWifi() {if (nWifiManager.isWifiEnabled()) {nWifiManager.setWifiEnabled(false);}}/** * 开始wifi扫描  */public void startScan() {nScanTask = new AsyncTask<String, Integer, String>() {@Overrideprotected String doInBackground(String... params) {int sleepTime = 2000;while (!nIsDestory && !nIsStopScan) {if (!isEnable()) {enableWifi(true);}publishProgress(0);// 检索scanWifi();nLocalScanResults.clear();// 得到本地的resultsArrayMap<String, LocalScanResult> nTmpLocalScanResults = new ArrayMap<String, LocalScanResult>();if (nWifiScanList != null && nWifiScanList.size() > 0) {for (ScanResult result : nWifiScanList) {LocalScanResult lsr = new LocalScanResult(result);nTmpLocalScanResults.put(result.SSID , lsr);}sleepTime = Constants.WIFI_SCAN_EXPIRE;}// 得到正在连接的wifi信息WifiInfo wifiInfo = nWifiManager.getConnectionInfo();if (wifiInfo != null) {Log.w(TAG, "wifi info = " + wifiInfo.toString());String ssid = wifiInfo.getSSID().replaceAll("\"", "");if (!TextUtils.isEmpty(ssid) && wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {LocalScanResult lsr = nTmpLocalScanResults.get(ssid);Log.w(TAG, "lsr = " + lsr);if (lsr != null) {lsr.setConnect(true);// 这里把连接上的放第一个nLocalScanResults.add(lsr);nTmpLocalScanResults.remove(ssid);}}}// 这里对nTmpLocalScanResults进行信号排序for (LocalScanResult result : sortResults(nTmpLocalScanResults)) {nLocalScanResults.add(result);}// 打印结果for (LocalScanResult result : nLocalScanResults) {Log.d(TAG, result.toString());}// 通知完成了一次检索publishProgress(1);if (sleepTime > Constants.WIFI_SCAN_EXPIRE) {sleepTime = Constants.WIFI_SCAN_EXPIRE;}try {Thread.sleep(sleepTime);} catch (InterruptedException e) {e.printStackTrace();}}return null;}@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);if (nWifiListeners == null) {return;}if (values[0] == 0) {for (WifiListener listenr : nWifiListeners) {listenr.onScanStart();}} else {for (WifiListener listenr : nWifiListeners) {listenr.onScanFinish();}}}};nIsStopScan = false;nScanTask.execute();}/** * 关闭扫描wifi */public void stopScan() {nIsStopScan = true;if (nScanTask != null) {nScanTask.cancel(true);}}private void scanWifi() {boolean scan = nWifiManager.startScan();Log.i(TAG, "startScan result:" + scan);nWifiScanList = nWifiManager.getScanResults();if (nWifiScanList != null) {Log.i(TAG, "startScan result:" + nWifiScanList.size());for (int i = 0; i < nWifiScanList.size(); i++) {ScanResult result = nWifiScanList.get(i);Log.i(TAG, "startScan result[" + i + "]" + result.SSID + ","+ result.BSSID);}Log.i(TAG, "startScan result end.");} else {Log.i(TAG, "startScan result is null.");}}/**连接一个扫描到的wifi,结果通过通知回调 * @param result result * @param password 连接密码,如果wifi不需要密码,这个参数会被忽略掉 * @param timeout 超时 */public void connect(LocalScanResult result, String password, int timeout) {// 如果result不全,那么通知连接失败if (result == null || result.getResult() == null) {for (WifiListener listener : nWifiListeners) {listener.onConnectFinish(result, true);}}// 创建wifi的连接配置WifiConfiguration config = createWifiConfiguration(result.getResult().SSID, password, result.getPasswordType());// 开始连接connect(result, config, timeout);}/** * @param result result * @param config 连接配置 * @param timeout 超时 */private void connect(LocalScanResult result, final WifiConfiguration config, int timeout) {int networkId = nWifiManager.addNetwork(config);Log.w(TAG, "networkID = " + networkId);if (networkId < 0) {for (WifiListener listener : nWifiListeners) {listener.onConnectFinish(result, false);}} else {connect(result, networkId, config, timeout, true);}}/** * @param result result * @param networkId 一个由wifiservice生成的连接id * @param config 配置 * @param timeout 超时 * @param otherStop 关闭其他的wifi */private void connect(final LocalScanResult result, final int networkId, final WifiConfiguration config, final int timeout, final boolean otherStop) {nIsStopConnect = false;// 主线程通知开始连接wifiGuideApplication.getHandler().post(new Runnable() {@Overridepublic void run() {for (WifiListener listener : nWifiListeners) {listener.onConnectStart(result);}}});// 通过调用隐藏代码来连接wifi设备nWifiManager.connect(networkId, new ActionListener() {@Overridepublic void onSuccess() {// 没有接口去监听连接的状态// 循环去获取wifi的连接状态 int timeCount = 0;boolean isConnect = isConnect(result.getResult().SSID);// 如果连接的SSID相同,并且已经连上了while (!isConnect && timeCount < timeout && !nIsStopConnect) {isConnect = isConnect(result.getResult().SSID);try {Thread.sleep(1000);timeCount += 1000;} catch (InterruptedException e) {e.printStackTrace();}}if (nIsStopConnect) {return;}if (!isConnect) {GuideApplication.getHandler().post(new Runnable() {@Overridepublic void run() {for (WifiListener listener : nWifiListeners) {listener.onConnectFinish(result, false);}}});} else {//Log.w(TAG, "enable ret = " + nWifiManager.enableNetwork(networkId, true));GuideApplication.getHandler().post(new Runnable() {@Overridepublic void run() {for (WifiListener listener : nWifiListeners) {listener.onConnectFinish(result, true);}}});}}@Overridepublic void onFailure(int arg0) {Log.w(TAG, "onFailure code = " + arg0);GuideApplication.getHandler().post(new Runnable() {@Overridepublic void run() {for (WifiListener listener : nWifiListeners) {listener.onConnectFinish(result, false);}}});}});}/** * 断开正在进行的连接 */public void stopConnect() {nIsStopConnect = true;WifiInfo info = nWifiManager.getConnectionInfo();if (info != null && info.getSSID() != null) {if (info.getNetworkId() >= 0) {nWifiManager.disableNetwork(info.getNetworkId());}nWifiManager.disconnect();}}/**创建一个wifi连接配置 * @param SSID ssid 没有引号 * @param password 密码 * @param type 类型 1 不要密码, 2 要密码, 3要密码 {@link LocalScanResult#getPasswordType()} * @return  */private WifiConfiguration createWifiConfiguration(String SSID, String password, int type) {Log.i(TAG, "SSID:" + SSID + ",password:" + password);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.getExistWifiConfiguration(SSID);if (tempConfig != null) {nWifiManager.removeNetwork(tempConfig.networkId);} else {Log.i(TAG, "IsExsits is null.");}// WIFICIPHER_NOPASSif (type == 1) {Log.i(TAG, "Type =1.");// 不把这个注释掉,不要密码的wifi返回-1id//config.wepKeys[0] = "";config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;}// WIFICIPHER_WEPif (type == 2) {Log.i(TAG, "Type =2.");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;}// WIFICIPHER_WPAif (type == 3) {Log.i(TAG, "Type =3.");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;}/** 得到wifi名为ssid的配置 * @param SSID * @return */private WifiConfiguration getExistWifiConfiguration(String SSID) { List<WifiConfiguration> existingConfigs = nWifiManager.getConfiguredNetworks();for (WifiConfiguration existingConfig : existingConfigs) {if (existingConfig.SSID.equals("\"" + SSID + "\"")) {return existingConfig;}}return null;}/** * @return wifi是否打开 */public boolean isEnable() {return nWifiManager.isWifiEnabled();}/**wifi开关 * @param enable 是否打开  * @return 操作成功返回true */public boolean enableWifi(boolean enable) {return nWifiManager.setWifiEnabled(enable);}/**这个ssid的wifi是否已经连上 * @param ssid  不用加引号 * @return */public boolean isConnect(String ssid) {WifiInfo info = nWifiManager.getConnectionInfo();Log.w(TAG, "wifi info = " + info);if (info != null && info.getSSID().equals("\"" + ssid + "\"")&& info.getSupplicantState() == SupplicantState.COMPLETED) {return true;} else {return false;}}/**得到本地封装的wifi list * @return */public ArrayList<LocalScanResult> getLocalScanResults() {return new ArrayList<LocalScanResult>(nLocalScanResults);}/**对arrayMaps进行排序 * @param arrayMaps * @return */private ArrayList<LocalScanResult> sortResults(ArrayMap<String, LocalScanResult> arrayMaps) {ArrayList<LocalScanResult> list = new ArrayList<LocalScanResult>();for (int i = 0; i < arrayMaps.size() - 1; i++) {for(int j = i + 1; j < arrayMaps.size(); j++) {LocalScanResult iValue = arrayMaps.valueAt(i);LocalScanResult jValue = arrayMaps.valueAt(j);if (jValue.getSingnal() > iValue.getSingnal()) {arrayMaps.setValueAt(i, jValue);arrayMaps.setValueAt(j, iValue);}}list.add(arrayMaps.valueAt(i));}return list;}/**动作监听<br> * TODO 如果有必要得到正在连接的状态(如握手,验证,授权等)。 * {@link WifiTool#connect(LocalScanResult, int, WifiConfiguration, int, boolean)} * 可以来完成这样的监听 * @author WenYF * */public interface WifiListener {public void onScanStart();public void onScanFinish();public void onConnectStart(LocalScanResult conf);public void onConnectFinish(LocalScanResult conf, boolean isSuccess);}public class LocalScanResult {private boolean isConnect;private ScanResult result;public LocalScanResult(ScanResult result) {isConnect = false;this.result = result;}public void setConnect(boolean isConnect) {this.isConnect = isConnect;}public boolean isConnect() {return isConnect;}public ScanResult getResult() {return result;}public int getPasswordType() {if (result == null) {Log.i("LocalScanResult", "result == null");return 1;}if (result.capabilities.contains("WEP")) {return 2;} else if (result.capabilities.contains("WPA")) {return 3;} else {return 1;}}public int getSingnal() {int signal = WifiManager.calculateSignalLevel(result.level, 4);return  signal;}@Overridepublic String toString() {return "LocalScanResult [isConnect=" + isConnect + ", result=" + result+ ", signal=" + getSingnal() + "]";}}}


这里你需要处理3个错误

1 设置scan时间

2 设置handler

3 通过反射调用WifiManager的conenct函数

(博主用的是系统编出来的jar,不需要用反射 大笑



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为隐私空间密码忘记了怎么办 华为手机王者太卡怎么办 华为手机太卡怎么办呢 华为手机5x太卡!怎么办 华为手机玩游戏时太卡了怎么办? 买到华为翻新机怎么办 华为畅享8声音小怎么办 华为5a安全模式怎么办 手机跳屏怎么办金立 苹果手机触控不灵敏怎么办 华为mate8手机声音小怎么办 华为mate9相机无法对焦怎么办 新疆外地电信卡信号差怎么办 华为手机搜索不到wifi怎么办 华为浏览器恢复只有一个页面怎么办 华为手机触摸屏没反应怎么办 快递不给送上楼怎么办 华为荣耀手机声音小怎么办 华为手机来电铃声小怎么办 s弯出来时老压线怎么办 苹果7p手机弯了怎么办 小米手机摔弯了怎么办 华为畅享5没声音怎么办 掌阅语音闪退怎么办 华为mate开屏成排线怎么办 华为mate8电池坏了怎么办 8plus拍照不清晰怎么办 荣耀手环3丢了怎么办 华为mate9手机声音小怎么办 华为麦芒6丢了怎么办 华为麦芒4无法访问移动网络怎么办 自拍时屏幕是白的怎么办 华为麦芒5手机音量小怎么办 小米5x玩王者卡怎么办 小米5x打王者卡怎么办 华为荣耀10卡顿怎么办 麦芒6记不得密码怎么办 华为麦芒4镜头碎了怎么办 三星s5出像网的信号怎么办 华为手机进海水资料怎么办 华为手机进海水了怎么办