您的位置:首页 > 移动开发 > Android开发

Android开发--WIFI开发

2015-08-25 09:40 453 查看
在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。主要包括以下几个类和接口:(1)ScanResult主要是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。 在我们进行wifi 搜索的时候,一般会搜到这些信息,首先是接入点名字、接入点信息的强弱、还有接入点使用的安全模式,是WPA、WPE;打开这个类,我们可以看到以下几个信息 BSSID 接入点的地址,这里主要是指小范围几个无线设备相连接所获取的地址,比如说两台笔记本通过无线网卡进行连接,双方的无线网卡分配的地址。SSID 网络的名字,当我们搜索一个网络时,就是靠这个来区分每个不同的网络接入点。Capabilities 网络接入的性能,这里主要是来判断网络的加密方式等。Frequency 频率,每一个频道交互的MHz 数。Level 等级,主要来判断网络连接的优先数。这里只提供了一个方法,就是将获得信息编程字符串toString()。(2)wifiConfiguration在我们连通一个wifi 接入点的时候,需要获取到的一些信息。大家可以跟我们有线的设备进行对比一下。这里的数据相对来说比较复杂一下。六个子类WifiConfiguration.AuthAlgorthm 用来判断加密方法。WifiConfiguration.GroupCipher 获取使用GroupCipher 的方法来进行加密。WifiConfiguration.KeyMgmt 获取使用KeyMgmt 进行。WifiConfiguration.PairwiseCipher 获取使用WPA 方式的加密。WifiConfiguration.Protocol 获取使用哪一种协议进行加密。wifiConfiguration.Status 获取当前网络的状态。对于上述加密感兴趣的朋友,可以在网上搜索相关的内容。设置WifiConfiguration的属性:WifiConfiguration.AuthAlgorthm 设置加密方法。可选参数:LEAP只用于leap,OPEN 被wpa/wpa2需要,SHARED需要一个静态的wep keyWifiConfiguration.GroupCipher 使用GroupCipher 的方法来进行加密。可选参数:CCMP,TKIP,WEP104,WEP40WifiConfiguration.KeyMgmt 键管理机制(keymanagerment),使用KeyMgmt 进行。可选参数IEEE8021X,NONE,WPA_EAP,WPA_PSKWifiConfiguration.PairwiseCipher 设置加密方式。可选参数 CCMP,NONE,TKIPWifiConfiguration.Protocol 设置一种协议进行加密。可选参数 RSN,WPA,wifiConfiguration.Status 设置当前网络的状态。可选参数CURRENT,DISABLED,ENABLED

(3)WifiInfo

在我们的wifi 已经连通了以后,可以通过这个类获得一些已经连通的wifi 连接的信息获取当前链接的信息,这里信息就比较简单了,这里简单介绍一下这里的方法:getBSSID() 获取BSSIDgetDetailedStateOf() 获取客户端的连通性getHiddenSSID() 获得SSID 是否被隐藏getIpAddress() 获取IP 地址getLinkSpeed() 获得连接的速度getMacAddress() 获得Mac 地址getRssi() 获得802.11n 网络的信号getSSID() 获得SSIDgetSupplicanState() 返回具体客户端状态的信息

(4)wifiManager

这个不用说,就是用来管理我们的wifi 连接,这里已经定义好了一些类,可以供我们使用。这里来说相对复杂,里面的内容比较多,但是通过字面意思,我们还是可以获得很多相关的信息。这个类里面预先定义了许多常量,我们可以直接使用,不用再次创建。这里还是简单介绍一下这里的方法:addNetwork(WifiConfiguration config) 通过获取到的网络的链接状态信息,来添加网络calculateSignalLevel(int rssi , int numLevels) 计算信号的等级compareSignalLevel(int rssiA, int rssiB) 对比连接A 和连接BcreateWifiLock(int lockType, String tag) 创建一个wifi 锁,锁定当前的wifi 连接disableNetwork(int netId) 让一个网络连接失效disconnect() 断开连接enableNetwork(int netId, Boolean disableOthers) 连接一个连接getConfiguredNetworks() 获取网络连接的状态getConnectionInfo() 获取当前连接的信息getDhcpInfo() 获取DHCP 的信息getScanResulats() 获取扫描测试的结果getWifiState() 获取一个wifi 接入点是否有效isWifiEnabled() 判断一个wifi 连接是否有效pingSupplicant() ping 一个连接,判断是否能连通ressociate() 即便连接没有准备好,也要连通reconnect() 如果连接准备好了,连通removeNetwork() 移除某一个网络saveConfiguration() 保留一个配置信息setWifiEnabled() 让一个连接有效startScan() 开始扫描updateNetwork(WifiConfiguration config) 更新一个网络连接的信息此外wifiManaer 还提供了一个内部的子类,也就是wifiManagerLock,WifiManagerLock 的作用是这样的,在普通的状态下,如果我们的wifi 的状态处于闲置,那么网络的连通,将会暂时中断。但是如果我们把当前的网络状态锁上,那么wifi 连通将会保持在一定状态,当然接触锁定之后,就会恢复常态获取WIFI网卡的状态  WIFI网卡的状态是由一系列的整形常量来表示的。  1.WIFI_STATE_DISABLED : WIFI网卡不可用(1)  2.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)  3.WIFI_STATE_ENABLED : WIFI网卡可用(3)  4.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)  5.WIFI_STATE_UNKNOWN : 未知网卡状态实现目标:搜索WIFI,手动输入密码并保存,连接WIFI。第二次连接该WIFI信号不需要输入密码首先在AndroidManifest.XML中开启响应的权限
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission><!-- 允许程序改变网络链接状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!--允许程序访问访问WIFI网络状态信息  -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 允许程序改变WIFI链接状态 -->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
1、开启WIFI
/开启WIFI
public void WifiOpen(){
	if(!localWifiManager.isWifiEnabled()){
		localWifiManager.setWifiEnabled(true);
	}
}
2、扫描WIFI信号
//扫描wifi
public void WifiStartScan(){
	localWifiManager.startScan();
}
3、得到扫描WIFI结果
//得到Scan结果
public List<ScanResult> getScanResults(){
	return localWifiManager.getScanResults();//得到扫描结果
}
4、得到WIFi的配置好的信息,包含配置好的密码
//得到Wifi配置好的信息
public void getConfiguration(){
	wifiConfigList = localWifiManager.getConfiguredNetworks();//得到配置好的网络信息
	for(int i =0;i<wifiConfigList.size();i++){
		Log.i("getConfiguration",wifiConfigList.get(i).SSID);
		Log.i("getConfiguration",String.valueOf(wifiConfigList.get(i).networkId));
	}
}
5、根据WIFI的名称SSID判定指定WIFI是否已经配置好,配置好则返回其networkId,用于连接。之前尝试了BSSID地址没成功,所以只能使用SSID
//判定指定WIFI是否已经配置好,依据WIFI的地址BSSID,返回NetId
public int IsConfiguration(String SSID){
	Log.i("IsConfiguration",String.valueOf(wifiConfigList.size()));
	for(int i = 0; i < wifiConfigList.size(); i++){
		Log.i(wifiConfigList.get(i).SSID,String.valueOf( wifiConfigList.get(i).networkId));
		if(wifiConfigList.get(i).SSID.equals(SSID)){//地址相同
    		return wifiConfigList.get(i).networkId;
		}
	}
	return -1;
}
6、如果需要连接的WIFI没有配置好,即没有保存密码。则为指定名称ssid的WIFI添加密码信息psw,添加成功后返回给其分配的networId,同于连接
/添加指定WIFI的配置信息,原列表不存在此SSID
public int AddWifiConfig(List<ScanResult> wifiList,String ssid,String pwd){
	int wifiId = -1;
	for(int i = 0;i < wifiList.size(); i++){
		ScanResult wifi = wifiList.get(i);
		if(wifi.SSID.equals(ssid)){
			Log.i("AddWifiConfig","equals");
			WifiConfiguration wifiCong = new WifiConfiguration();
			wifiCong.SSID = "\""+wifi.SSID+"\"";//\"转义字符,代表"
			wifiCong.preSharedKey = "\""+pwd+"\"";//WPA-PSK密码
			wifiCong.hiddenSSID = false;
			wifiCong.status = WifiConfiguration.Status.ENABLED;
			wifiId = localWifiManager.addNetwork(wifiCong);//将配置好的特定WIFI密码信息添加,添加完成后默认是不激活状态,成功返回ID,否则为-1
			if(wifiId != -1){
				return wifiId;
			}
		}
	}
	return wifiId;
}
7、根据步骤6配置好需要连接的WIFI密码信息后,下面通过networkId连接指定WIFI。在连接经过步骤6刚添加配置信息的WIFI信号之前需要重新执行下步骤4,得到新的配置好信息的列表。
//连接指定Id的WIFI
public boolean ConnectWifi(int wifiId){
	for(int i = 0; i < wifiConfigList.size(); i++){
		WifiConfiguration wifi = wifiConfigList.get(i);
		if(wifi.networkId == wifiId){
			while(!(localWifiManager.enableNetwork(wifiId, true))){//激活该Id,建立连接
			    //status:0--已经连接,1--不可连接,2--可以连接
				Log.i("ConnectWifi",String.valueOf(wifiConfigList.get(wifiId).status));
			}
			return true;
		}
	}
	return false;
}
核心代码:
package com.example.controlpcpro;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import com.wifi.utils.WifiPswDialog;
import com.wifi.utils.WifiPswDialog.OnCustomDialogListener;
import com.wifi.utils.WifiUtils;

public class ControlPCMainActivity extends Activity {
	private String wifiPassword = null;
	private Button wifiSearchButton;
	private WifiUtils localWifiUtils;
	private List<ScanResult> wifiResultList;
	private List<String> wifiListString = new ArrayList<String>();
	private ListView wifiSearchListView;
	private ArrayAdapter<String> arrayWifiAdapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_control_pcmain);
		
		wifiSearchButton = (Button)findViewById(R.id.wifiSearchButton);
		WIFIButtonListener wifiButtonListener = new WIFIButtonListener();
		wifiSearchButton.setOnClickListener(wifiButtonListener);
		wifiSearchListView = (ListView)findViewById(R.id.wifiListView);
		arrayWifiAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,wifiListString);
		wifiSearchListView.setAdapter(arrayWifiAdapter);
		ListOnItemClickListener wifiListListener = new ListOnItemClickListener();
		wifiSearchListView.setOnItemClickListener(wifiListListener);
		
		localWifiUtils = new WifiUtils(ControlPCMainActivity.this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.control_pcmain, menu);
		return true;
	}
	

	class WIFIButtonListener implements OnClickListener{
		@Override
		public void onClick(View view) {
			// TODO Auto-generated method stub
			wifiListString.clear();
			localWifiUtils.WifiOpen();
			localWifiUtils.WifiStartScan();
			//0正在关闭,1WIFi不可用,2正在打开,3可用,4状态不可zhi
			while(localWifiUtils.WifiCheckState() != WifiManager.WIFI_STATE_ENABLED){//等待Wifi开启
				Log.i("WifiState",String.valueOf(localWifiUtils.WifiCheckState()));
			}
			try {
					Thread.sleep(3000);//休眠3s,不休眠则会在程序首次开启WIFI时候,处理getScanResults结果,wifiResultList.size()发生异常
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			wifiResultList = localWifiUtils.getScanResults();
			localWifiUtils.getConfiguration();
			if(wifiListString != null){
				Log.i("WIFIButtonListener","dataChange");
				scanResultToString(wifiResultList,wifiListString);
			}
		}
	}
	
	class ListOnItemClickListener implements OnItemClickListener{
		String wifiItemSSID = null;
		private View selectedItem;
		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			// TODO Auto-generated method stub
			Log.i("ListOnItemClickListener","start");
			selectedItem = arg1;
			arg1.setBackgroundResource(R.color.gray);//点击的Item项背景设置
			String wifiItem = arrayWifiAdapter.getItem(arg2);//获得选中的设备
			String []ItemValue = wifiItem.split("--");
			wifiItemSSID = ItemValue[0]; 
			Log.i("ListOnItemClickListener",wifiItemSSID);
			int wifiItemId = localWifiUtils.IsConfiguration("\""+wifiItemSSID+"\"");
			Log.i("ListOnItemClickListener",String.valueOf(wifiItemId));
			if(wifiItemId != -1){
				if(localWifiUtils.ConnectWifi(wifiItemId)){//连接指定WIFI
					arg1.setBackgroundResource(R.color.green);
				}
			}
			else{//没有配置好信息,配置
				WifiPswDialog pswDialog = new WifiPswDialog(ControlPCMainActivity.this,new OnCustomDialogListener() {
					@Override
					public void back(String str) {
						// TODO Auto-generated method stub
						wifiPassword = str;
						if(wifiPassword != null){
							int netId = localWifiUtils.AddWifiConfig(wifiResultList,wifiItemSSID, wifiPassword);
							Log.i("WifiPswDialog",String.valueOf(netId));
							if(netId != -1){
								localWifiUtils.getConfiguration();//添加了配置信息,要重新得到配置信息
								if(localWifiUtils.ConnectWifi(netId)){
									selectedItem.setBackgroundResource(R.color.green);
								}
							}
							else{
								Toast.makeText(ControlPCMainActivity.this, "网络连接错误", Toast.LENGTH_SHORT).show();
								selectedItem.setBackgroundResource(R.color.burlywood);
							}
						}
						else{
							selectedItem.setBackgroundResource(R.color.burlywood);
						}
					}
				});
				pswDialog.show();
			}
		}
	}
	//ScanResult类型转为String
	public void scanResultToString(List<ScanResult> listScan,List<String> listStr){
		for(int i = 0; i <listScan.size(); i++){
			ScanResult strScan = listScan.get(i);
			String str = strScan.SSID+"--"+strScan.BSSID;
			boolean bool = listStr.add(str);
			if(bool){
				arrayWifiAdapter.notifyDataSetChanged();//数据更新,只能单个Item更新,不能够整体List更新
			}
			else{
				Log.i("scanResultToSting","fail");
			}
			Log.i("scanResultToString",listStr.get(i));
		}
	}
	/*private BroadcastReceiver WifiBroadcastRec = new BroadcastReceiver(){
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String wifiAction = intent.getAction();
		if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(wifiAction)){
			int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_ENABLED);
			if(wifiState == WifiManager.WIFI_STATE_ENABLED){
				try {
					Thread.sleep(3000);//休眠3s,不休眠则会在程序首次开启WIFI时候,处理getScanResults结果,wifiResultList.size()发生异常
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				wifiResultList = localWifiUtils.getScanResults();
				localWifiUtils.getConfiguration();
				if(wifiListString != null){
					scanResultToString(wifiResultList,wifiListString);
				}
			}
		}  
	  }
	};*/
}
WifiUtil.java
package com.wifi.utils;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.util.Log;

public class WifiUtils {
	private WifiManager localWifiManager;//提供Wifi管理的各种主要API,主要包含wifi的扫描、建立连接、配置信息等
	//private List<ScanResult> wifiScanList;//ScanResult用来描述已经检测出的接入点,包括接入的地址、名称、身份认证、频率、信号强度等
	private List<WifiConfiguration> wifiConfigList;//WIFIConfiguration描述WIFI的链接信息,包括SSID、SSID隐藏、password等的设置
	private WifiInfo wifiConnectedInfo;//已经建立好网络链接的信息
	private WifiLock wifiLock;//手机锁屏后,阻止WIFI也进入睡眠状态及WIFI的关闭
	
	public WifiUtils( Context context){
		localWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
	}
	
    //检查WIFI状态
	public int WifiCheckState(){
		return localWifiManager.getWifiState();
	}
	
	//开启WIFI
	public void WifiOpen(){
		if(!localWifiManager.isWifiEnabled()){
			localWifiManager.setWifiEnabled(true);
		}
	}
	
	//关闭WIFI
	public void WifiClose(){
		if(!localWifiManager.isWifiEnabled()){
			localWifiManager.setWifiEnabled(false);
		}
	}
	
	//扫描wifi
	public void WifiStartScan(){
		localWifiManager.startScan();
	}
	
	//得到Scan结果
	public List<ScanResult> getScanResults(){
		return localWifiManager.getScanResults();//得到扫描结果
	}

	//Scan结果转为Sting
	public List<String> scanResultToString(List<ScanResult> list){
		List<String> strReturnList = new ArrayList<String>();
		for(int i = 0; i < list.size(); i++){
			ScanResult strScan = list.get(i);
			String str = strScan.toString();
			boolean bool = strReturnList.add(str);
			if(!bool){
				Log.i("scanResultToSting","Addfail");
			}
		}
		return strReturnList;
	}
	
	//得到Wifi配置好的信息
	public void getConfiguration(){
		wifiConfigList = localWifiManager.getConfiguredNetworks();//得到配置好的网络信息
		for(int i =0;i<wifiConfigList.size();i++){
			Log.i("getConfiguration",wifiConfigList.get(i).SSID);
			Log.i("getConfiguration",String.valueOf(wifiConfigList.get(i).networkId));
		}
	}
	//判定指定WIFI是否已经配置好,依据WIFI的地址BSSID,返回NetId
	public int IsConfiguration(String SSID){
		Log.i("IsConfiguration",String.valueOf(wifiConfigList.size()));
		for(int i = 0; i < wifiConfigList.size(); i++){
			Log.i(wifiConfigList.get(i).SSID,String.valueOf( wifiConfigList.get(i).networkId));
			if(wifiConfigList.get(i).SSID.equals(SSID)){//地址相同
				return wifiConfigList.get(i).networkId;
			}
		}
		return -1;
	}

	//添加指定WIFI的配置信息,原列表不存在此SSID
	public int AddWifiConfig(List<ScanResult> wifiList,String ssid,String pwd){
		int wifiId = -1;
		for(int i = 0;i < wifiList.size(); i++){
			ScanResult wifi = wifiList.get(i);
			if(wifi.SSID.equals(ssid)){
				Log.i("AddWifiConfig","equals");
				WifiConfiguration wifiCong = new WifiConfiguration();
				wifiCong.SSID = "\""+wifi.SSID+"\"";//\"转义字符,代表"
				wifiCong.preSharedKey = "\""+pwd+"\"";//WPA-PSK密码
				wifiCong.hiddenSSID = false;
				wifiCong.status = WifiConfiguration.Status.ENABLED;
				wifiId = localWifiManager.addNetwork(wifiCong);//将配置好的特定WIFI密码信息添加,添加完成后默认是不激活状态,成功返回ID,否则为-1
				if(wifiId != -1){
					return wifiId;
				}
			}
		}
		return wifiId;
	}
	
	//连接指定Id的WIFI
	public boolean ConnectWifi(int wifiId){
		for(int i = 0; i < wifiConfigList.size(); i++){
			WifiConfiguration wifi = wifiConfigList.get(i);
			if(wifi.networkId == wifiId){
				while(!(localWifiManager.enableNetwork(wifiId, true))){//激活该Id,建立连接
					Log.i("ConnectWifi",String.valueOf(wifiConfigList.get(wifiId).status));//status:0--已经连接,1--不可连接,2--可以连接
				}
				return true;
			}
		}
		return false;
	}
	
	//创建一个WIFILock
	public void createWifiLock(String lockName){
		wifiLock = localWifiManager.createWifiLock(lockName);
	}
	
	//锁定wifilock
	public void acquireWifiLock(){
		wifiLock.acquire();
	}
	
	//解锁WIFI
	public void releaseWifiLock(){
		if(wifiLock.isHeld()){//判定是否锁定
			wifiLock.release();
		}
	}
	
	//得到建立连接的信息
	public void getConnectedInfo(){
		wifiConnectedInfo = localWifiManager.getConnectionInfo();
	}
	//得到连接的MAC地址
	public String getConnectedMacAddr(){
		return (wifiConnectedInfo == null)? "NULL":wifiConnectedInfo.getMacAddress();
	}
	
	//得到连接的名称SSID
	public String getConnectedSSID(){
		return (wifiConnectedInfo == null)? "NULL":wifiConnectedInfo.getSSID();
	}
	
	//得到连接的IP地址
	public int getConnectedIPAddr(){
		return (wifiConnectedInfo == null)? 0:wifiConnectedInfo.getIpAddress();
	}
	
	//得到连接的ID
	public int getConnectedID(){
		return (wifiConnectedInfo == null)? 0:wifiConnectedInfo.getNetworkId();
	}
}
package com.wifi.utils;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.example.controlpcpro.R;

public class WifiPswDialog extends Dialog{
	private Button cancelButton;
	private Button okButton;
	private EditText pswEdit;
	private OnCustomDialogListener customDialogListener;
	public WifiPswDialog(Context context,OnCustomDialogListener customListener) {
			//OnCancelListener cancelListener) {
		super(context);
		// TODO Auto-generated constructor stub
		customDialogListener = customListener;
		
	}
	//定义dialog的回调事件
	public interface OnCustomDialogListener{
		void back(String str);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.wifi_config_dialog);
		setTitle("请输入密码");
		pswEdit = (EditText)findViewById(R.id.wifiDialogPsw);
		cancelButton = (Button)findViewById(R.id.wifiDialogCancel);
		okButton = (Button)findViewById(R.id.wifiDialogCertain);
		cancelButton.setOnClickListener(buttonDialogListener);
		okButton.setOnClickListener(buttonDialogListener);
		
	}
	
	private View.OnClickListener buttonDialogListener = new View.OnClickListener() {

		@Override
		public void onClick(View view) {
			// TODO Auto-generated method stub
			if(view.getId() == R.id.wifiDialogCancel){
				pswEdit = null;
				customDialogListener.back(null);
				cancel();//自动调用dismiss();
			}
			else{
				customDialogListener.back(pswEdit.getText().toString());
				dismiss();
			}
		}
	};
	
}
传送门:链接:http://pan.baidu.com/s/1sj3fKaL 密码:ds5w
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: