设为首页 收藏本站
查看: 1416|回复: 0

[经验分享] Android 监听wifi总结

[复制链接]

尚未签到

发表于 2015-9-30 13:03:33 | 显示全部楼层 |阅读模式
  功能实现:控制wifi开关,连上某个特定的wifi。
  

  首先先上个wifi工具类,此类转载网上一人,出处不明了。
  

package rodar.rgs.conference.utils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
public class WifiConnect {
WifiManager wifiManager;
//定义几种加密方式,一种是WEP,一种是WPA,还有没有密码的情况
public enum WifiCipherType
{
WIFICIPHER_WEP,WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
}
//构造函数
public WifiConnect(WifiManager wifiManager)
{
this.wifiManager = wifiManager;
}
//打开wifi功能
private boolean OpenWifi()
{
boolean bRet = true;
if (!wifiManager.isWifiEnabled())
{
bRet = wifiManager.setWifiEnabled(true);  
}
return bRet;
}
//提供一个外部接口,传入要连接的无线网
public boolean Connect(String SSID, String Password, WifiCipherType Type)
{
if(!this.OpenWifi())
{
return false;
}
System.out.println(">>>wifiCon=");
//开启wifi功能需要一段时间(我在手机上测试一般需要1-3秒左右),所以要等到wifi
//状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句
while(wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING )
{
try{
//为了避免程序一直while循环,让它睡个100毫秒在检测……
Thread.currentThread();
Thread.sleep(100);
}
catch(InterruptedException ie){
}
}
WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);
//
if(wifiConfig == null)
{
return false;
}
WifiConfiguration tempConfig = this.IsExsits(SSID);
if(tempConfig != null)
{
wifiManager.removeNetwork(tempConfig.networkId);
}
//        try {
//        //高级选项
//        String ip  ="192.168.1.201";
//        int networkPrefixLength =24;
//        InetAddress intetAddress  = InetAddress.getByName(ip);
//        int intIp = inetAddressToInt(intetAddress);  
//        String dns = (intIp & 0xFF ) + "." + ((intIp >> 8 ) & 0xFF) + "." + ((intIp >> 16 ) & 0xFF) + ".1";
//        setIpAssignment("STATIC", wifiConfig); //"STATIC" or "DHCP" for dynamic setting
//        setIpAddress(intetAddress, networkPrefixLength, wifiConfig);
//        setGateway(InetAddress.getByName(dns), wifiConfig);
//        setDNS(InetAddress.getByName(dns), wifiConfig);
//        } catch (Exception e) {
//        // TODO: handle exception
//        e.printStackTrace();
//        }
int netID = wifiManager.addNetwork(wifiConfig);
boolean bRet = wifiManager.enableNetwork(netID, true);
//    wifiManager.updateNetwork(wifiConfig);

return bRet;
}
//查看以前是否也配置过这个网络
private WifiConfiguration IsExsits(String SSID)
{
List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs)
{
if (existingConfig.SSID.equals("\""+SSID+"\""))
{
return existingConfig;
}
}
return null;
}
private WifiConfiguration CreateWifiInfo(String SSID, String Password, WifiCipherType Type)
{
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + SSID + "\"";  
if(Type == WifiCipherType.WIFICIPHER_NOPASS)
{
config.wepKeys[0] = "";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if(Type == WifiCipherType.WIFICIPHER_WEP)
{
config.preSharedKey = "\""+Password+"\"";
config.hiddenSSID = true;  
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;
}
if(Type == WifiCipherType.WIFICIPHER_WPA)
{
config.preSharedKey = "\""+Password+"\"";
config.hiddenSSID = true;  
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);  
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                        
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);                        
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                  
//config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);   
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;  
}
else
{
return null;
}
return config;
}


/***
* Convert a IPv4 address from an InetAddress to an integer
* @param inetAddr is an InetAddress corresponding to the IPv4 address
* @return the IP address as an integer in network byte order
*/
public static int inetAddressToInt(InetAddress inetAddr)
throws IllegalArgumentException {
byte [] addr = inetAddr.getAddress();
if (addr.length != 4) {
throw new IllegalArgumentException("Not an IPv4 address");
}
return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) |
((addr[1] & 0xff) << 8) | (addr[0] & 0xff);
}
public static void setIpAssignment(String assign, WifiConfiguration wifiConf)throws SecurityException, IllegalArgumentException,NoSuchFieldException, IllegalAccessException {
setEnumField(wifiConf, assign, "ipAssignment");
}
public static void setEnumField(Object obj, String value, String name) throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getField(name);
f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));
}
public static void setIpAddress(InetAddress addr, int prefixLength,WifiConfiguration wifiConf) throws SecurityException,IllegalArgumentException,
NoSuchFieldException,IllegalAccessException, NoSuchMethodException,ClassNotFoundException, InstantiationException,InvocationTargetException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
Class laClass = Class.forName("android.net.LinkAddress");
Constructor laConstructor = laClass.getConstructor(new Class[] {InetAddress.class, int.class });
Object linkAddress = laConstructor.newInstance(addr, prefixLength);
ArrayList mLinkAddresses = (ArrayList) getDeclaredField(linkProperties,"mLinkAddresses");
mLinkAddresses.clear();
mLinkAddresses.add(linkAddress);
}
public static void setGateway(InetAddress gateway,WifiConfiguration wifiConf) throws SecurityException,IllegalArgumentException,
NoSuchFieldException,IllegalAccessException, ClassNotFoundException,NoSuchMethodException, InstantiationException,InvocationTargetException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
Class routeInfoClass = Class.forName("android.net.RouteInfo");
Constructor routeInfoConstructor = routeInfoClass.getConstructor(new Class[] { InetAddress.class });
Object routeInfo = routeInfoConstructor.newInstance(gateway);
ArrayList mRoutes = (ArrayList) getDeclaredField(linkProperties,"mRoutes");
mRoutes.clear();
mRoutes.add(routeInfo);
}
public static void setDNS(InetAddress dns, WifiConfiguration wifiConf) throws SecurityException, IllegalArgumentException,NoSuchFieldException, IllegalAccessException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
ArrayList<InetAddress> mDnses = (ArrayList<InetAddress>) getDeclaredField(linkProperties, "mDnses");
mDnses.clear(); // or add a new dns address , here I just want to replace DNS1
mDnses.add(dns);
}
public static Object getField(Object obj, String name) throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getField(name);
Object out = f.get(obj);
return out;
}
public static Object getDeclaredField(Object obj, String name) throws SecurityException, NoSuchFieldException,IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getDeclaredField(name);
f.setAccessible(true);
Object out = f.get(obj);
return out;
}
//    public void editStaticWifiConfig(final ScanResult sr,String pwd, String ip, String gateway,int prefixLength,String dns) throws Exception{        
//    WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID);
//   
//    if(historyWifiConfig == null){
//    historyWifiConfig = createComWifiConfig(sr.SSID,pwd);
//    int netId = mWifiManager.addNetwork(historyWifiConfig);
//    mWifiManager.enableNetwork(netId, true);
//    }
//   
//        setIpAssignment("STATIC", historyWifiConfig); //"STATIC" or "DHCP" for dynamic setting
//        setIpAddress(InetAddress.getByName(ip), prefixLength, historyWifiConfig);
//        setGateway(InetAddress.getByName(gateway), historyWifiConfig);
//        setDNS(InetAddress.getByName(dns), historyWifiConfig);
//        
//        mWifiManager.updateNetwork(historyWifiConfig); //apply the setting
//}
//   
//    public void editDhcpWifiConfig(final ScanResult sr,String pwd) throws Exception{        
//    WifiConfiguration historyWifiConfig = getHistoryWifiConfig(sr.SSID);
//   
//    if(historyWifiConfig == null){
//    historyWifiConfig = createComWifiConfig(sr.SSID,pwd);
//    int netId = mWifiManager.addNetwork(historyWifiConfig);
//    mWifiManager.enableNetwork(netId, true);
//    }
//   
//        setIpAssignment("DHCP", historyWifiConfig); //"STATIC" or "DHCP" for dynamic setting
//        
//        mWifiManager.updateNetwork(historyWifiConfig); //apply the setting
//}
}

  类中注释高级选项处,是连接上wifi同时自己设定ip.记得wifiManager.updateNetwork(wifiConfig);
  
  类中boolean bRet = wifiManager.enableNetwork(netID, true); 第二个参数true表示如果当前已经有连上一个wifi,要强制连到自己设定的wifi上,此参数必须为true否则连上的还是原来的wifi.
  

  调用此类示例
  

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConnect wifi = new WifiConnect(wifiManager);
wifi.Connect("wifiName", "wifipPassword",
WifiCipherType.WIFICIPHER_WPA);
  
需要的权限
  
  

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

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
  
如何在广播监听wifi的状态
  
  广播接收类
  

package rodar.rgs.conference.utils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
public class WifiStateReceiver extends BroadcastReceiver{
//0 --> WIFI_STATE_DISABLING
//1 --> WIFI_STATE_DISABLED
//2 --> WIFI_STATE_ENABLING
//3 --> WIFI_STATE_ENABLED
//4 --> WIFI_STATE_UNKNOWN

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();
int oldInt = bundle.getInt("previous_wifi_state");
int newInt = bundle.getInt("wifi_state");
System.out.println(">>>oldInt="+oldInt+",newInt="+newInt);
//      String oldStr = (oldInt>=0 && oldInt<WIFI_STATES.length) ?WIFI_STATES[oldInt] :"?";
//      String newStr = (newInt>=0 && oldInt<WIFI_STATES.length) ?WIFI_STATES[newInt] :"?";
//      Log.e("", "oldS="+oldStr+", newS="+newStr);
//      if(newInt==WifiManager.WIFI_STATE_DISABLED || newInt==WifiManager.WIFI_STATE_ENABLED) {
//         onWifiStateChange();  // define this function elsewhere!
//      } else if(newInt==WifiManager.WIFI_STATE_DISABLING ||
//                newInt==WifiManager.WIFI_STATE_ENABLING)
//      {
////       chkbox_wifi.setText(newStr);
//      } else {
//       newStr += " (Is wpa_supplicant.conf readable?)";
////       chkbox_wifi.setText(newStr);
//      }
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifiManager.getConnectionInfo();
System.out.println(">>>onReceive.wifiInfo="+info.toString());
System.out.println(">>>onReceive.SSID="+info.getSSID());
//if(!info.getSSID().equals("Rodar")){
//WifiConnect wifi = new WifiConnect(wifiManager);
//wifi.Connect("Rodar", "rodar.5779858",
//WifiCipherType.WIFICIPHER_WPA);
//System.out.println(">>>onReceive.SSID1="+info.getSSID());
//}

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction()))
{
Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (null != parcelableExtra)
{
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
switch (networkInfo.getState())
{
case CONNECTED:
Log.e("APActivity", "CONNECTED");
break;
case CONNECTING:
Log.e("APActivity", "CONNECTING");
break;
case DISCONNECTED:
Log.e("APActivity", "DISCONNECTED");
break;
case DISCONNECTING:
Log.e("APActivity", "DISCONNECTING");
break;
case SUSPENDED:
Log.e("APActivity", "SUSPENDED");
break;
case UNKNOWN:
Log.e("APActivity", "UNKNOWN");
break;
default:
break;
}
}
}

}

//// 显示Wifi状态以及ip地址:
//public static String StringizeIp(int ip) {
//  int ip4 = (ip>>24) & 0x000000FF;
//  int ip3 = (ip>>16) & 0x000000FF;
//  int ip2 = (ip>> 8 )& 0x000000FF;
//  int ip1 = ip       & 0x000000FF;
//  return Integer.toString(ip1) + "." + ip2 + "." + ip3 + "." + ip4;
//}
//private void onWifiStateChange() {
//         String ip_str = "";
//         WifiInfo info = mMainWifi.getConnectionInfo();
//         if(info != null) {
//          int ipaddr = info.getIpAddress();
//          ip_str = " (ip="+StringizeIp(ipaddr)+")";
//         }
//        
//        if(mMainWifi.isWifiEnabled()==true)
//               chkbox_wifi.setText("Wifi is on [" + ip_str + "]");
//        else
//               chkbox_wifi.setText("Wifi is off");
//        
//}
}

  
注册和取消广播一般在onstart和onstop里
  
  

WifiStateReceiver wifiStateReceiver;
@Override
protected void onStart() {
//注册网络监听
wifiStateReceiver = new WifiStateReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(wifiStateReceiver, filter);
super.onStart();
}
@Override
protected void onStop() {
//注销网络监听
unregisterReceiver(wifiStateReceiver);
super.onStop();
}
  
关于广播监控wifi开关还是连接状态可以看这个连接
  
  http://www.cnblogs.com/wanghafan/archive/2013/01/10/2855096.html

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120961-1-1.html 上篇帖子: android 中判断WiFi是否可用的可靠方法 ,android 是否联网 下篇帖子: 想出手买一个LOOX 720了!VGA、USBHOST、IrDA+BT+Wifi、SD+CF ...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表