WIFI部分:
WifiManager代表Android中Wifi连接服务,用于配置管理WIFI连接,通过getSystemService获得,获得方式如下:
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
public int getWifiState(){
return wifiManager.getWifiState();
}
public void openWifi(){
if(!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}
}
public void closeWifi(){
if(wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(false);
}
}
private List getScanResult(){
wifiManager.startScan();
List wifiList = wifiManager.getScanResults();
return wifiList;
}
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;
public void reconnectWifi(String SSID){
for(int i=0;i
调用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的方法如下:
public void disConnected(){
WifiInfo connectInfo = wifiManager.getConnectionInfo();
int networkId = connectInfo.getNetworkId();
wifiManager.disableNetwork(networkId);
wifiManager.disconnect();
}
在Android中,ConnectivityManager类代表网络连接服务,它被用来监控网络连接状态,配置失效重连,并控制网络天线等。获取Connectivity Manager实例的方法是使用getSystemService,并指定Context.CONNECTIVITY_SERVICE作为参数,代码片段如下:
conManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
要使用Connectivity Manager来读写网络状态时,需要在AndroidManifest.xml文件中加入如下的许可:
Connectivity Manager在较高层面提供了管理可用网络连接的接口,使用getActiveNetworkInfo和getNetworkInfo函数可以查询获取NetworkInfo对象,该对象包含了当前活动网络连接或者指定类型的不可用网络连接的详细信息。
1.1)设置首选网络
当任何认证的应用程序请求网络连接时,Android都会优先尝试使用首选网络连接。设置首选网络连接的函数是setNetworkPreference,代码片段如下:
conManager.setNetworkPreference(ConnectivityManager.TYPE_WIFI);
当首选网络连接不可用或者连接丢失时,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);
setWifiApEnable.invoke(wifiManager,null, false);