zoukankan      html  css  js  c++  java
  • android.net.wifi的简单使用方法

                

     获取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类型。

    1.   private String intToString(int a){  
    2.     StringBuffer sb=new StringBuffer();  
    3.     int b=(a>>0)&0xff;  
    4.     sb.append(b+".");  
    5.     b=(a>>8)&0xff;  
    6.     sb.append(b+".");  
    7.     b=(a>>16)&0xff;  
    8.     sb.append(b+".");  
    9.     b=(a>>24)&0xff;  
    10.     sb.append(b);  
    11. return sb.toString();  
    12.   }  
        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 。 


    1. //判断WIFI是否连接  
    //判断WIFI是否连接
    1. private boolean isConnected(Context context){  
    2.     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
    3.     NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
    4.     System.out.println(ni.getState());  
    5.     System.out.println(ni.getDetailedState()+"-----");  
    6.     if(ni != null && ni.getState()==State.CONNECTED)  
    7.         return true;  
    8.     return false;  
    9. }  
    	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;
    	}
    1. private boolean isWifiConected(Context context) {  
    2.     WifiManager wm = (WifiManager) context  
    3.             .getSystemService(Context.WIFI_SERVICE);  
    4.     List<WifiConfiguration> list = wm.getConfiguredNetworks();  
    5.     Iterator<WifiConfiguration> it = list.iterator();  
    6.     while (it.hasNext()) {  
    7.         WifiConfiguration wc = it.next();  
    8.         if (wc.status == WifiConfiguration.Status.CURRENT)  
    9.             return true;  
    10.     }  
    11.     return false;  
    12. }//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可能为空。

    1. public String getMac() {  
    2.     WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);  
    3.     WifiInfo wi = wm.getConnectionInfo();  
    4.     if(wi == null)  
    5.         return null;  
    6.     return wi.getMacAddress();  
    7. }
  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/bigben0123/p/4505277.html
Copyright © 2011-2022 走看看