Android系统Wifi详解

来源:互联网 发布:id矢量制图软件 编辑:程序博客网 时间:2024/05/17 22:11

WIFI部分:

WifiManager代表Android中Wifi连接服务,用于配置管理WIFI连接,通过getSystemService获得,获得方式如下:

wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

在这之前需要配置Wifi的权限:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

通过调用wifiManager的setWifiEnabled方法可以切换wifi状态,setWifiEnabled的参数为true时为打开wifi,为flase为关闭;当然,在这之前最好先调用getWifiState或者isWifiEnabled查看当前wifi的状态,getWifiState的返回值为WifiManager中的WIFI_STATE_ENABLED、WIFI_STATE_ENABLING、WIFI_STATE_DISENABLED、WIFI_STAT_DISENABLING、WIFI_STATE_UNKNOWN中的一个,这与监听WIFI_STATE_CHANGE_ACTION时从接收到的广播中取出的状态是一样的,当wifi状态改变时,就能接收来之系统附带当前wifi状态的广播。

public int getWifiState(){return wifiManager.getWifiState();}

public void openWifi(){if(!wifiManager.isWifiEnabled()){wifiManager.setWifiEnabled(true);}}

public void closeWifi(){if(wifiManager.isWifiEnabled()){wifiManager.setWifiEnabled(false);}}

调用wifiManager的startScan方法开始扫描周围可连接的WIFI,然后调用getSancResults方法可以获得扫描到的可连接wifi。

private List<ScanResult> getScanResult(){wifiManager.startScan();List<ScanResult> wifiList = wifiManager.getScanResults();return wifiList;}

ScanResult类中记录的是扫描到的热点的信息,包括:

SSID wifi的名字

BSSID 接入点的地址,也是wifi网卡的mac地址(手机wifi网卡下wifi通道和p2p通道mac地址不同)

capabilities wifi的加密方式

frequency wifi的频率

level wifi的信号强度

连接wifi需要调用wifimanager的enableNetwork方法,这个方法的第一个参数是需要连接wifi网络的networkId,第二个参数是指连接当前wifi网络是否需要断开其他网络:

wifiManager.enableNetwork(networkId, true);
若是未连接过的wifi网络,networkId可以通过wifimanager的addNetwork方法获得,addNetwork方法的参数是一个wifi网络配置WifiConfiguration类:

networkId = wifiManager.addNetwork(wifiConfig);

这时候就需要自己去手动配置一个WifiConfiguration类了:

WifiConfiguration wifiConfig = new WifiConfiguration();wifiConfig.SSID = "\"" + SSID + "\"";wifiConfig.BSSID = "\"" + BSSID + "\"";wifiConfig.preSharedKey = "\"" + password + "\"";wifiConfig.status = WifiConfiguration.Status.ENABLED;

或者连接的网络是已经连接过的,可以调用wifiManager的getConfiguredNetworks方法获得已经配置过的列表,然后找到需要连接的节点取出networkId或者通过wifiManager的 updateNetwork方法获得networkId:

public void reconnectWifi(String SSID){for(int i=0;i<wifiManager.getConfiguredNetworks().size();i++){if(SSID.equals(wifiManager.getConfiguredNetworks().get(i).SSID.replace("\"", ""))){WifiConfiguration wifiConfig = wifiManager.getConfiguredNetworks().get(i);int networkId = wifiConfig.networkId;//int networkId = wifiManager.updateNetwork(wifiConfig);wifiManager.enableNetwork(networkId, true);}}}
调用wifiManager的getConnectionInfo可以看到当前已经连接的wifi的信息,其中包含自己的ip地址和mac地址

WifiInfo connectInfo = wifiManager.getConnectionInfo();

public String getIP(){int ip = wifiManager.getConnectionInfo().getIpAddress();return (ip&0xff)+"."+((ip>>8)&0xff)+"."+((ip>>16)&0xff)+"."+((ip>>24)&0xff);}

当wifi的连接状态变化时,系统会发送NETWORK_STATE_CHANGED_ACTION广播,广播中携带EXTRA_NETWORK_INFO会包含已连接的wifi的信息。

断开wifi的方法如下:

public void disConnected(){WifiInfo connectInfo = wifiManager.getConnectionInfo();int networkId = connectInfo.getNetworkId();wifiManager.disableNetwork(networkId);wifiManager.disconnect();}

ConnectivityManager

在Android中,ConnectivityManager类代表网络连接服务,它被用来监控网络连接状态,配置失效重连,并控制网络天线等。获取Connectivity Manager实例的方法是使用getSystemService,并指定Context.CONNECTIVITY_SERVICE作为参数,代码片段如下:

conManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

要使用Connectivity Manager来读写网络状态时,需要在AndroidManifest.xml文件中加入如下的许可:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

Connectivity Manager在较高层面提供了管理可用网络连接的接口,使用getActiveNetworkInfo和getNetworkInfo函数可以查询获取NetworkInfo对象,该对象包含了当前活动网络连接或者指定类型的不可用网络连接的详细信息。

1.1)设置首选网络

当任何认证的应用程序请求网络连接时,Android都会优先尝试使用首选网络连接。设置首选网络连接的函数是setNetworkPreference,代码片段如下: 

<pre name="code" class="java">conManager<span style="font-family: SimSun; font-size: 10px;">.setNetworkPreference(ConnectivityManager.TYPE_WIFI); </span>

当首选网络连接不可用或者连接丢失时,Android将自动尝试使用第二优先连接类型。


1.2)监控网络连接

ConnectivityManager最常用的一个功能就是当网络连接状态改变时通知应用程序,这是通过应用程序实现自己的Broadcast Receiver来监听ConnectivityManager.CONNECTIVITY_ACTION类型的intent来实现的。这个intent提供了以下几种extra来进一步明确发生改变的网络状态:

1)ConnectivityManager.EXTRA_IS_FAILOVER:值为true说明当前的连接是首选网络失效重连后的连接;

2)ConnectivityManager.EXTRA_NO_CONNECTIVITY:值为true表示当前设备没有连接到网络;

3)ConnectivityManager.EXTRA_REASON:如果当前的广播代表网络失效,则这个值包含了连接失效的原因描述;

4)ConnectivityManager.EXTRA_NETWORK_INFO:返回NetworkInfo对象,包含了当前连接事件相关的网络详细信息;

5)ConnectivityManager.EXTRA_OTHER_NETWORK_INFO:在一个网络断开连接时,这个值返回NetworkInfo对象,包含了可能的网络失效重连的详细信息;

6)ConnectivityManager.EXTRA_EXTRA_INFO:包含可选的网络连接的额外信息。

AP部分

wifiManager中有一个叫setWifiApEnabled的方法是用来打开android系统的热点的,但是这个方法被隐藏了,所以需要用反射的方法才能使用这个方法:

 Method setWifiApEnable = wifiManager.getClass().getMethod("setWifiApEnabled",WifiConfiguration.class, Boolean.TYPE);

 setWifiApEnable.invoke(wifiManager,wifiConfig, true);

关闭AP:

setWifiApEnable.invoke(wifiManager,null, false);





0 0
原创粉丝点击