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

[经验分享] android.net.wifi的简单使用方法

[复制链接]

尚未签到

发表于 2015-10-1 09:57:38 | 显示全部楼层 |阅读模式
  


  获取Wifi的控制类WifiManager。  WifiManager  wm=(WifiManager)getSystemService(Context.WIFI_SERVICE); 接下来可以对wifi操作了,比如要打开、关闭wifi,可以通过WifiManager的setWifiEnabled()方法来开关wifi。 若要查看一些信息,可以通过getConnectionInfo()方法得到WifiInfo类的对象,WifiInfo类里主要提供手机wifi上面存储的连接信息。 WifiInfo类方法: 1、getBSSID()   获取接入点的mac地址(String) 2、getIpAddress()  获取本机的IP地址   (int) 3、getLinkSpeed()  获取连接速度(不是下载速度),单位为Mbps  (int) 4、getMacAddress()  获取mac地址  (String) 5、getNetworkId()    获取网络id号。每一个设定好了的网络都有一个独一无二的整数型ID号,用来识别网络,当操作请求时(翻译)。简而言之,就是这个号就是代表一个连接点,手机可以通过wifi连接很多无线网的。 6、getRssi()       返回收到的信号强度,是个负数。(好像到-113就表示一点信号都没有,也就是说数越大信号就越好) 7、getSSID()    获取无线信号提供者的名称  (就是要连的网络的名字)(String) 上面那个类只能查到本机的mac地址与ip,要只查看本机的详细信息,可以通过这个类:DhcpInfo df=wm.getDhcpInfo(); DhcpInfo类没什么方法,提供了一些字段: 1、dns1   第一个DNS 2、dns2 如上 3、gateway   网关 4、ipAddress  IP地址 5、netmask 子网掩码 6、serverAddress 服务端地址(其实就是路由器ip,和网关一样) 7、leaseDuration   和上面的getLinkSpeed()  方法的值接近,可能是连接速度,不过单位不是Mbps,getLinkSpeed()  得到72,这个字段的值是7200
上面的IP与网关、子网掩码等都是int型数值,直接看看不懂,附上一个我写的方法把int转成String类型。






[java] view plaincopyprint?

  •   private String intToString(int a){  
  •     StringBuffer sb=new StringBuffer();  
  •     int b=(a>>0)&0xff;  
  •     sb.append(b+".");  
  •     b=(a>>8)&0xff;  
  •     sb.append(b+".");  
  •     b=(a>>16)&0xff;  
  •     sb.append(b+".");  
  •     b=(a>>24)&0xff;  
  •     sb.append(b);
  • return sb.toString();  
  •   }

    private String intToString(int a){
StringBuffer sb=new StringBuffer();
int b=(a>>0)&0xff;
sb.append(b+".");
b=(a>>8)&0xff;
sb.append(b+".");
b=(a>>16)&0xff;
sb.append(b+".");
b=(a>>24)&0xff;
sb.append(b);
return sb.toString();
}
  WifiConfiguration 类主要提供一个wifi配置的所有信息 有如下字段(自己明白的不一定正确): BSSID 接入点的mac地址。 SSID    接入点的名字。 networkId  网络号 preSharedKey  WPA-PSK密码,如果有就会得到一个*(这玩意就是判断是不是有密码的) priority   优先级
  status   连接状态,值是WifiConfiguration.Status中字段的一种。
  WifiConfiguration.Status  提供了3个字段表示wifi连接的三种状态 1.CURRENT   值为0,表示处于连接状态 2.DISABLED   值为1,表示网络不可用 3. ENABLED   值为2,表示网络可用但没连接
  ScanResult  wifi扫描到的接入点信息 1.BSSID 2.SSID  3.capabilities 4.frequency 5.level
  
  关于接收WIFI状态改变接收广播信息:
  ACTION:  WifiManager.WIFI_STATE_CHANGED_ACTION ( "android.net.wifi.WIFI_STATE_CHANGED")wifi状态变化触发,触发两次。
  可接收两个信息:(键) (这个是监听wifi状态变化的,wifi状态变化并不包括wifi的连接状态,只是单纯的指示wifi的5种状态)
  1. WifiManager.EXTRA_PREVIOUS_WIFI_STATE("previous_wifi_state") int型值  intent.getIntExtra("键",0);(第二个为得不到时的默认值)
  2. WifiManager.EXTRA_WIFI_STATE("wifi_state") int型值   intent.getIntExtra("键",0);(第二个为得不到时的默认值)
  
  ACTION: WifiManager.NETWORK_STATE_CHANGED_ACTION("android.net.wifi.STATE_CHANGE")wifi连接网络的状态广播,连接过程中接收多次,在连接过程中可与获取NetworkInfo对象,通过ni.getState()可以获取wifi连接状态。如果连接state处于connected状态,可以通过WifiManager.EXTRA_WIFI_INFO得到wifiInfo对象。(不重要细节:测试时发现 下面isconnected()方法为true时,这个广播还处于connecting状态,再一次广播才变成connected)
  可接收两个信息:(键)
  1. WifiManager.EXTRA_BSSID("bssid")         String类型值      intent.getStringExtra("键")
  2. WifiManager.EXTRA_NETWORK_INFO("networkInfo")    T    getParcelableExtra(“键”)
  
  ACTION: WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION( "android.net.wifi.supplicant.CONNECTION_CHANGE") 判断是否WIFI打开了,变化触发一次
  可接收一个信息:(键)(这个应该是广播wifi启动状态的,true表示连接到wifi设备,一般在wifi state处于enable时得到,false则表示断开设备连接,wifi此时状态为disabling。这只是指机器内的wifi连接状态变化,与网络无关)
  1. WifiManager.EXTRA_SUPPLICANT_CONNECTED("connected")    boolean类型返回值   intent.getBooleanExtra(“键”, true)第二个是默认值
  
  ACTION: WifiManager.SUPPLICANT_STATE_CHANGED_ACTION("android.net.wifi.supplicant.STATE_CHANGE")发送WIFI连接的过程信息,如果出错ERROR信息才会收到。连接WIFI时触发,触发多次。
  可接收两个信息:(键)
  1. WifiManager.EXTRA_NEW_STATE("newState")           intent.getParcelableExtra("键")
  2. WifiManager.EXTRA_SUPPLICANT_ERROR("supplicantError")        int型值  getIntExtra(“键”, int)
  
  WIFI状态int值对应的状态:
  WifiManager.WIFI_STATE_DISABLED ==1
  WifiManager.WIFI_STATE_DISABLING ==0
  WifiManager. WIFI_STATE_ENABLED==3
  WifiManager. WIFI_STATE_ENABLING==2
  WifiManager. WIFI_STATE_UNKNOWN==4
  上面的是在有wifi的环境下测的,没在没WIFI的环境下测,不一定准,但差不多了。测试机型HTC G17。
  
  如果在连接WIFI的过程中(Connecting),去连接网络地址(比如http://www.baidu.com)会得到找不到地址的异常,并且在8秒左右之内(就测了一台定制机),不能连接这一地址,否则报找不到地址异常。
  
  这个包并不判断网络连接状态,只是判断wifi的各种状态,如果需要判断网络状态, 在android.net包中。ConnectivityManager 。
  
  
  







[java] view plaincopyprint?

  • //判断WIFI是否连接  

//判断WIFI是否连接





[java] view plaincopyprint?

  • private boolean isConnected(Context context){  
  •     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  •     NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  •     System.out.println(ni.getState());
  •     System.out.println(ni.getDetailedState()+"-----");  
  •     if(ni != null && ni.getState()==State.CONNECTED)  
  •         return true;  
  •     return false;  
  • }

private boolean isConnected(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
System.out.println(ni.getState());
System.out.println(ni.getDetailedState()+"-----");
if(ni != null && ni.getState()==State.CONNECTED)
return true;
return false;
}





[java] view plaincopyprint?

  • private boolean isWifiConected(Context context) {  
  •     WifiManager wm = (WifiManager) context
  •             .getSystemService(Context.WIFI_SERVICE);
  •     List<WifiConfiguration> list = wm.getConfiguredNetworks();
  •     Iterator<WifiConfiguration> it = list.iterator();
  •     while (it.hasNext()) {  
  •         WifiConfiguration wc = it.next();
  •         if (wc.status == WifiConfiguration.Status.CURRENT)  
  •             return true;  
  •     }
  •     return false;  
  • }//2012.11.12在4.0机器上发现这个方法一直返回false,估计我理解错了,不要用。  

private boolean isWifiConected(Context context) {
WifiManager wm = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> list = wm.getConfiguredNetworks();
Iterator<WifiConfiguration> it = list.iterator();
while (it.hasNext()) {
WifiConfiguration wc = it.next();
if (wc.status == WifiConfiguration.Status.CURRENT)
return true;
}
return false;
}//2012.11.12在4.0机器上发现这个方法一直返回false,估计我理解错了,不要用。
  
  
  WifiInfo不为空并不代表这个类里面就存了信息,getMacAdress可能为空。
  
  






[java] view plaincopyprint?

  • public String getMac() {  
  •     WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
  •     WifiInfo wi = wm.getConnectionInfo();
  •     if(wi == null)  
  •         return null;  
  •     return wi.getMacAddress();  
  • }

运维网声明 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-121199-1-1.html 上篇帖子: Turn Your Raspberry Pi Into a WiFi Hotspot with Edimax Nano USB EW-7811Un (RTL81 下篇帖子: Android之Wifi使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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