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;
}
@Override
public int getCount() {
return wifiList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public 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);
else
wifi_state.setBackgroundResource(R.drawable.wifilevel0);
} else if (childData.level < -85) {
if (lock_type)
wifi_state.setBackgroundResource(R.drawable.wifilevel1_lock);
else
wifi_state.setBackgroundResource(R.drawable.wifilevel1);
} else if (childData.level < -70) {
if (lock_type)
wifi_state.setBackgroundResource(R.drawable.wifilevel2_lock);
else
wifi_state.setBackgroundResource(R.drawable.wifilevel2);
} else if (childData.level < -60) {
if (lock_type)
wifi_state.setBackgroundResource(R.drawable.wifilevel3_lock);
else
wifi_state.setBackgroundResource(R.drawable.wifilevel3);
} else if (childData.level < -50) {
if (lock_type)
wifi_state.setBackgroundResource(R.drawable.wifilevel4_lock);
else
wifi_state.setBackgroundResource(R.drawable.wifilevel4);
}
convertView.setTag("wifi_" + childData.BSSID);
return convertView;
}
}
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;
@Override
protected 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); // 设置优先级,最高为1000
context.registerReceiver(wifiResultChange, labelIntentFilter);
}
private void scanAndGetResult() {
// 开始扫描
wifiManager.startScan();
}
/**
*接收wifi热点改变事件
*/
private final BroadcastReceiver wifiResultChange = new BroadcastReceiver() {
@Override
public 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>(){
@Override
public 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() {
@Override
public 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();
}
}
@Override
public void onDestroy() {
super.onDestroy();
context.unregisterReceiver(wifiResultChange); // 注销此广播接收器
}
}