android wifi连接与断开

来源:互联网 发布:javascript和php哪个好 编辑:程序博客网 时间:2024/04/18 17:48

android 实现wifi连接与断开 可以完全代替系统设置的wifi管理功能,搜索wifi按照信号强度排序,button刷新,记住密码等功能

源码地址:http://download.csdn.net/detail/u014774589/9161089

LinkWifi.java

package com.example.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;public class LinkWifi {private WifiManager wifiManager;/** 定义几种加密方式,一种是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) {wifiManager = (WifiManager) context.getSystemService(Service.WIFI_SERVICE);}/** * 检测wifi状态 opened return true; */public boolean checkWifiState() {boolean isOpen = true;int wifiState = wifiManager.getWifiState();if (wifiState == WifiManager.WIFI_STATE_DISABLED|| wifiState == WifiManager.WIFI_STATE_DISABLING|| wifiState == WifiManager.WIFI_STATE_UNKNOWN|| wifiState == WifiManager.WIFI_STATE_ENABLING) {isOpen = false;}return isOpen;}public boolean ConnectToNetID(int netID) {return wifiManager.enableNetwork(netID, true);}/** 查看以前是否也配置过这个网络 */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 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 setMaxPriority(WifiConfiguration config) {int priority = getMaxPriority() + 1;if (priority > 99999) {priority = shiftPriorityAndSave();}config.priority = priority; wifiManager.updateNetwork(config);// 本机之前配置过此wifi热点,直接返回return config;}/** 配置一个连接 */public WifiConfiguration CreateWifiInfo(String SSID, String BSSID,String password, WifiCipherType type) {int priority;WifiConfiguration config = this.IsExsits(SSID);if (config != null) {// 本机之前配置过此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;priority = getMaxPriority() + 1;if (priority > 99999) {priority = shiftPriorityAndSave();}config.priority = priority; // 2147483647;/* 各种加密方式判断 */if (type == WifiCipherType.WIFI_CIPHER_NOPASS) {config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;} else if (type == WifiCipherType.WIFI_CIPHER_WEP) {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) {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) {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) {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;}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 SjrsWifiManagerCompare());}class SjrsWifiManagerCompare implements Comparator<WifiConfiguration> {public int compare(WifiConfiguration paramWifiConfiguration1,WifiConfiguration paramWifiConfiguration2) {return paramWifiConfiguration1.priority- paramWifiConfiguration2.priority;}}}


WifiRelayListAdapter.java

package com.example.wifitest;import java.util.List;import com.sjrs08.wifitest.R;import android.app.Service;import android.content.Context;import android.net.wifi.ScanResult;import android.net.wifi.WifiManager;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class WifiRelayListAdapter extends BaseAdapter {private Context context;private List<ScanResult> wifiList;private Handler setWifiHandler = null;public WifiRelayListAdapter(Context context, List<ScanResult> wifiList,Handler setWifiHandler) {this.context = context;this.wifiList = wifiList;this.setWifiHandler = setWifiHandler;}@Overridepublic int getCount() {return wifiList.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// convertView为null的时候初始化convertView。if (convertView == null) {LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);convertView = inflater.inflate(R.layout.wifi_child, null);}final ScanResult childData = wifiList.get(position);/** * 加载资源 */ImageView wifi_state = (ImageView) convertView.findViewById(R.id.wifi_state);TextView wifi_info_text = (TextView) convertView.findViewById(R.id.wifi_info);TextView wifi_lock_text = (TextView) convertView.findViewById(R.id.wifi_lock);wifi_info_text.setText(childData.SSID); // + "(" + childData.BSSID + ")");String lock_str;boolean lock_type = true;if (childData.capabilities.contains("WPA2-PSK")) {// WPA-PSK加密lock_str = "通过WPA2-PSK进行保护";} else if (childData.capabilities.contains("WPA-PSK")) {// WPA-PSK加密lock_str = "通过WPA-PSK进行保护";} else if (childData.capabilities.contains("WPA-EAP")) {// WPA-EAP加密lock_str = "通过WPA-EAP进行保护";} else if (childData.capabilities.contains("WEP")) {// WEP加密lock_str = "通过WEP进行保护";} else {// 无密码lock_str = "开放网络";lock_type = false;}LinkWifi linkWifi = new LinkWifi(context);WifiManager wifiManager = (WifiManager) context.getSystemService(Service.WIFI_SERVICE);if (linkWifi.IsExsits(childData.SSID) != null&& linkWifi.IsExsits(childData.SSID).networkId == wifiManager.getConnectionInfo().getNetworkId()) {lock_str+="(已连接)";}wifi_lock_text.setText(lock_str);// 点击的话,中继该无线convertView.setOnClickListener(new OnClickListener() {public void onClick(View arg0) {if (setWifiHandler != null) {Message msg = new Message();msg.what = 0;msg.obj = childData;setWifiHandler.sendMessage(msg);}}});convertView.setOnTouchListener(new View.OnTouchListener() {public boolean onTouch(View arg0, MotionEvent arg1) {if (arg1.getAction() == MotionEvent.ACTION_DOWN) {arg0.setBackgroundColor(0xaa333333);} else {arg0.setBackgroundColor(0x00ffffff);}return false; // 表示继续传递该消息,如果返回true则表示该消息不再被传递}});if (childData.level < -90) {if (lock_type)wifi_state.setBackgroundResource(R.drawable.wifilevel0_lock);elsewifi_state.setBackgroundResource(R.drawable.wifilevel0);} else if (childData.level < -85) {if (lock_type)wifi_state.setBackgroundResource(R.drawable.wifilevel1_lock);elsewifi_state.setBackgroundResource(R.drawable.wifilevel1);} else if (childData.level < -70) {if (lock_type)wifi_state.setBackgroundResource(R.drawable.wifilevel2_lock);elsewifi_state.setBackgroundResource(R.drawable.wifilevel2);} else if (childData.level < -60) {if (lock_type)wifi_state.setBackgroundResource(R.drawable.wifilevel3_lock);elsewifi_state.setBackgroundResource(R.drawable.wifilevel3);} else if (childData.level < -50) {if (lock_type)wifi_state.setBackgroundResource(R.drawable.wifilevel4_lock);elsewifi_state.setBackgroundResource(R.drawable.wifilevel4);}convertView.setTag("wifi_" + childData.BSSID);return convertView;}}


MainActivity
package com.example.wifitest;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import com.sjrs08.wifitest.R;import android.app.Activity;import android.app.AlertDialog;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.IntentFilter;import android.net.wifi.ScanResult;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiManager;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.view.Window;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private WifiManager wifiManager = null;private Context context = null;public SetWifiHandler setWifiHandler;private WifiRelayListAdapter wifiListAdapter;private WifiRelayListAdapter havelink_wifiListAdapter;private ListView wifi_list;private ListView havelink_wifi;private Button refresh_list_btn;private Button wifi_on_off_btn;private TextView wifi_tip;private LinkWifi linkWifi; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.layout_setwifirelay);context = this;linkWifi = new LinkWifi(context);wifiManager = (WifiManager) context.getSystemService(Service.WIFI_SERVICE);setWifiHandler = new SetWifiHandler(Looper.getMainLooper());wifi_list = (ListView) findViewById(R.id.wifi_list);havelink_wifi = (ListView) findViewById(R.id.havelink_wifi);refresh_list_btn = (Button) findViewById(R.id.refresh_list_btn);wifi_on_off_btn = (Button) findViewById(R.id.wifi_on_off_btn);wifi_tip = (TextView) findViewById(R.id.wifi_tip);refresh_list_btn.setOnClickListener(new OnClickListener() {public void onClick(View arg0) {Toast.makeText(context, "刷新wifi列表!", Toast.LENGTH_LONG).show();// 刷新wifi列表wifiManager.startScan();}});if (linkWifi.checkWifiState()) {wifi_on_off_btn.setBackgroundResource(R.drawable.wifi_on);wifi_tip.setVisibility(View.VISIBLE);} else {wifi_on_off_btn.setBackgroundResource(R.drawable.wifi_off);wifi_tip.setVisibility(View.INVISIBLE);}wifi_on_off_btn.setOnClickListener(new OnClickListener() {public void onClick(View arg0) {wifiManager.setWifiEnabled(!linkWifi.checkWifiState());}});regWifiReceiver();scanAndGetResult();}//@Override//public boolean onCreateOptionsMenu(Menu menu) {//getMenuInflater().inflate(R.menu.main, menu);//return true;//}//@Override//public boolean onOptionsItemSelected(MenuItem item) {//switch (item.getItemId()) {//default://new AlertDialog.Builder(context)//.setTitle("关于")//.setMessage("SJRS的无线管理演示\nQQ:568626884\n版本:V1.0(1)\n2014.10.24")//.setPositiveButton("确定",//new DialogInterface.OnClickListener() {//public void onClick(DialogInterface dialog,//int whichButton) {////return;//}//}).show();//break;//}//return false;//}private void regWifiReceiver() {IntentFilter labelIntentFilter = new IntentFilter();labelIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);labelIntentFilter.addAction("android.net.wifi.STATE_CHANGE"); labelIntentFilter.setPriority(1000); // 设置优先级,最高为1000context.registerReceiver(wifiResultChange, labelIntentFilter);}private void scanAndGetResult() {// 开始扫描wifiManager.startScan();}/** *接收wifi热点改变事件 */private final BroadcastReceiver wifiResultChange = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {showWifiList();} else if (action.equals("android.net.wifi.STATE_CHANGE")) {// 刷新状态显示showWifiList();}}};private void showWifiList() {// 剔除ssid中的重复项,只保留相同ssid中信号最强的哪一个List<ScanResult> wifiList = wifiManager.getScanResults();List<ScanResult> newWifList = new ArrayList<ScanResult>();List<ScanResult> havelink_Wifi = new ArrayList<ScanResult>();if (linkWifi.checkWifiState()) {wifi_on_off_btn.setBackgroundResource(R.drawable.wifi_on);wifi_tip.setVisibility(View.VISIBLE);} else {wifi_on_off_btn.setBackgroundResource(R.drawable.wifi_off);wifi_tip.setVisibility(View.INVISIBLE);}if (wifiList != null) {for (int i = 0; i < wifiList.size(); i++) {final ScanResult a = wifiList.get(i);LinkWifi linkWifi = new LinkWifi(context);WifiManager wifiManager = (WifiManager) context.getSystemService(Service.WIFI_SERVICE);if (linkWifi.IsExsits(a.SSID) != null&& linkWifi.IsExsits(a.SSID).networkId == wifiManager.getConnectionInfo().getNetworkId()){havelink_Wifi.add(wifiList.get(i));}else{newWifList.add(wifiList.get(i));}}}Collections.sort(newWifList, new Comparator<ScanResult>(){@Overridepublic int compare(ScanResult oldval, ScanResult newval) {int data1 = oldval.level;int data2 = newval.level;if(data1 < data2){return 1;}return -1;}});wifiListAdapter = new WifiRelayListAdapter(context, newWifList,setWifiHandler);havelink_wifiListAdapter = new WifiRelayListAdapter(context, havelink_Wifi, setWifiHandler);havelink_wifi.setAdapter(havelink_wifiListAdapter);wifi_list.setAdapter(wifiListAdapter);}public class SetWifiHandler extends Handler {public SetWifiHandler(Looper mainLooper) {super(mainLooper);}public void handleMessage(Message msg) {switch (msg.what) {case 0:// 请求操作某一无线网络ScanResult wifiinfo = (ScanResult) msg.obj;configWifiRelay(wifiinfo);break;}}}private void configWifiRelay(final ScanResult wifiinfo) {// 如果本机已经配置过的话if (linkWifi.IsExsits(wifiinfo.SSID) != null) {final int netID = linkWifi.IsExsits(wifiinfo.SSID).networkId;String actionStr;// 如果目前连接了此网络if (wifiManager.getConnectionInfo().getNetworkId() == netID) {actionStr = "断开";} else {actionStr = "连接";}new AlertDialog.Builder(context).setTitle("提示").setMessage("请选择你要进行的操作?").setPositiveButton(actionStr,new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int whichButton) {if (wifiManager.getConnectionInfo().getNetworkId() == netID) {wifiManager.disconnect();} else {WifiConfiguration config = linkWifi.IsExsits(wifiinfo.SSID);linkWifi.setMaxPriority(config);linkWifi.ConnectToNetID(config.networkId);}}}).setNeutralButton("忘记",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int whichButton) {wifiManager.removeNetwork(netID);return;}}).setNegativeButton("取消",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int whichButton) {return;}}).show();return;}String capabilities = "";if (wifiinfo.capabilities.contains("WPA2-PSK")) {// WPA-PSK加密capabilities = "psk2";} else if (wifiinfo.capabilities.contains("WPA-PSK")) {// WPA-PSK加密capabilities = "psk";} else if (wifiinfo.capabilities.contains("WPA-EAP")) {// WPA-EAP加密capabilities = "eap";} else if (wifiinfo.capabilities.contains("WEP")) {// WEP加密capabilities = "wep";} else {// 无密码capabilities = "";}if (!capabilities.equals("")) {// 有密码,提示输入密码进行连接LayoutInflater factory = LayoutInflater.from(context);final View inputPwdView = factory.inflate(R.layout.dialog_inputpwd,null);new AlertDialog.Builder(context).setTitle("请输入该无线的连接密码").setMessage("无线SSID:" + wifiinfo.SSID).setIcon(android.R.drawable.ic_dialog_info).setView(inputPwdView).setPositiveButton("确定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {EditText pwd = (EditText) inputPwdView.findViewById(R.id.etPassWord);String wifipwd = pwd.getText().toString();// 此处加入连接wifi代码int netID = linkWifi.CreateWifiInfo2(wifiinfo, wifipwd);linkWifi.ConnectToNetID(netID);}}).setNegativeButton("取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {}}).setCancelable(false).show();} else {// 无密码new AlertDialog.Builder(context).setTitle("提示").setMessage("你选择的wifi无密码,可能不安全,确定继续连接?").setPositiveButton("确定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int whichButton) {// 此处加入连接wifi代码int netID = linkWifi.CreateWifiInfo2(wifiinfo, "");linkWifi.ConnectToNetID(netID);}}).setNegativeButton("取消",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int whichButton) {return;}}).show();}}@Overridepublic void onDestroy() {super.onDestroy();context.unregisterReceiver(wifiResultChange); // 注销此广播接收器}}



1 0
原创粉丝点击