Android开发_Wifi(一)

Android Wifi 操作

在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。主要包括以下几个类和接口:

1.ScanResult

  主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,身份认证,频率,信号强度等信息。

2.WifiConfiguration

 Wifi网络的配置,包括安全设置等。

3.WifiInfo

 wifi无线连接的描述,包括接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息。这里简单介绍一下这里的方法:

       getBSSID() 获取BSSID

       getDetailedStateOf() 获取客户端的连通性

       getHiddenSSID() 获得SSID 是否被隐藏

       getIpAddress() 获取IP 地址

       getLinkSpeed() 获得连接的速度

       getMacAddress() 获得Mac 地址

       getRssi() 获得802.11n 网络的信号

       getSSID() 获得SSID

       getSupplicanState() 返回具体客户端状态的信息

4.WifiManager

  这个不用说,就是用来管理我们的wifi 连接,这里已经定义好了一些类,可以供我们使用。

  获取WIFI网卡的状态
  WIFI网卡的状态是由一系列的整形常量来表示的。
  1.WIFI_STATE_DISABLED : WIFI网卡不可用(1)
  2.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)
  3.WIFI_STATE_ENABLED : WIFI网卡可用(3)
  4.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)

  5.WIFI_STATE_UNKNOWN  : 未知网卡状态

二-----


1、AndroidMainifest.xml中添加permission

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

2、 Activity主程序WifiActivity中设置三个按键,Start,Stop, State(查看状态)

3、 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wifi);
        //start UI
        Start = (Button)findViewById(R.id.start);
        Stop = (Button)findViewById(R.id.stop);
        State = (Button)findViewById(R.id.state);
  
        //Methods
        //Set Wifi enable
        Start.setOnClickListener(new OnClickListener() {

public void onClick(View arg0) {

WifiManager wifi = (WifiManager) WifiActivity.this.getSystemService(WIFI_SERVICE);
wifi.setWifiEnabled(true);
System.out.println("Wifi_State -------> " + wifi.getWifiState());

}
});
        
        //Stop wifi
        Stop.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
WifiManager wifi = (WifiManager) WifiActivity.this.getSystemService(WIFI_SERVICE);
wifi.setWifiEnabled(false);
System.out.println("Wifi_State -------> " + wifi.getWifiState());

}
});


//Show wifi state 
        State.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
WifiManager wifi = (WifiManager) WifiActivity.this.getSystemService(WIFI_SERVICE);





System.out.println("Wifi_State -------> " + wifi.getWifiState());

}
});
        
    }
//完成基本的打开,关闭,查看状态功能

4、WifiManager 的建立
在activity中我们用 WifiActivity.this.getSystemService(WIFI_SERVICE)
(activity 继承自 context;)
public class

WifiManager

extends Object
java.lang.Object
   ↳ android.net.wifi.WifiManager

Class Overview


This class provides the primary API for managing all aspects of Wi-Fi connectivity. Get an instance of this class by callingContext.getSystemService(Context.WIFI_SERVICE). It deals with several categories of items:

5、

Public Methods
int addNetwork(WifiConfiguration config)
Add a new network description to the set of configured networks.
static int calculateSignalLevel(int rssi, int numLevels)
Calculates the level of the signal.
static int compareSignalLevel(int rssiA, int rssiB)
Compares two signal strengths.
WifiManager.MulticastLock createMulticastLock(String tag)
Create a new MulticastLock
WifiManager.WifiLock createWifiLock(int lockType, String tag)
Creates a new WifiLock.
WifiManager.WifiLock createWifiLock(String tag)
Creates a new WifiLock.
boolean disableNetwork(int netId)
Disable a configured network.
boolean disconnect()
Disassociate from the currently active access point.
boolean enableNetwork(int netId, boolean disableOthers)
Allow a previously configured network to be associated with.
List<WifiConfiguration> getConfiguredNetworks()
Return a list of all the networks configured in the supplicant.
WifiInfo getConnectionInfo()
Return dynamic information about the current Wi-Fi connection, if any is active.
DhcpInfo getDhcpInfo()
Return the DHCP-assigned addresses from the last successful DHCP request, if any.
List<ScanResult> getScanResults()
Return the results of the latest access point scan.
int getWifiState()
Gets the Wi-Fi enabled state.
boolean isWifiEnabled()
Return whether Wi-Fi is enabled or disabled.
boolean pingSupplicant()
Check that the supplicant daemon is responding to requests.
boolean reassociate()
Reconnect to the currently active access point, even if we are already connected.
boolean reconnect()
Reconnect to the currently active access point, if we are currently disconnected.
boolean removeNetwork(int netId)
Remove the specified network from the list of configured networks.
boolean saveConfiguration()
Tell the supplicant to persist the current list of configured networks.
boolean setWifiEnabled(boolean enabled)
Enable or disable Wi-Fi.
boolean startScan()
Request a scan for access points.
int updateNetwork(WifiConfiguration config)
Update the network description of an existing configured network.
Protected Methods
void finalize()
Invoked when the garbage collector has detected that this instance is no longer reachable.
三、

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.      >  
  6.   
  7.  <LinearLayout  
  8.     android:orientation="vertical"    
  9.     android:layout_width="fill_parent"    
  10.     android:layout_height="fill_parent"    
  11.     >    
  12. <Button    
  13.     android:id="@+id/scan"    
  14.     android:layout_width="wrap_content"     
  15.     android:layout_height="wrap_content"     
  16.     android:text="扫描网络"    
  17.     />    
  18. <Button    
  19.     android:id="@+id/start"    
  20.     android:layout_width="wrap_content"     
  21.     android:layout_height="wrap_content"     
  22.     android:text="打开Wifi"    
  23.     />    
  24. <Button    
  25.     android:id="@+id/stop"    
  26.     android:layout_width="wrap_content"     
  27.     android:layout_height="wrap_content"     
  28.     android:text="关闭Wifi"    
  29.     />    
  30. <Button    
  31.     android:id="@+id/check"    
  32.     android:layout_width="wrap_content"     
  33.     android:layout_height="wrap_content"     
  34.     android:text="Wifi状态"    
  35.     />    
  36.   <TextView    
  37.     android:id="@+id/allNetWork"    
  38.     android:layout_width="fill_parent"    
  39.     android:layout_height="wrap_content"     
  40.     android:text="当前没有扫描到Wifi网络"    
  41.     />    
  42.     </LinearLayout>  
  43. </ScrollView>  



  1. import java.util.List;  
  2.   
  3. import android.content.Context;  
  4. import android.net.wifi.ScanResult;  
  5. import android.net.wifi.WifiConfiguration;  
  6. import android.net.wifi.WifiInfo;  
  7. import android.net.wifi.WifiManager;  
  8. import android.net.wifi.WifiManager.WifiLock;  
  9.   
  10. public class WifiAdmin {  
  11.     //定义一个WifiManager对象  
  12.     private WifiManager mWifiManager;  
  13.     //定义一个WifiInfo对象  
  14.     private WifiInfo mWifiInfo;  
  15.     //扫描出的网络连接列表  
  16.     private List<ScanResult> mWifiList;  
  17.     //网络连接列表  
  18.     private List<WifiConfiguration> mWifiConfigurations;  
  19.     WifiLock mWifiLock;  
  20.     public WifiAdmin(Context context){  
  21.         //取得WifiManager对象  
  22.         mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE);  
  23.         //取得WifiInfo对象  
  24.         mWifiInfo=mWifiManager.getConnectionInfo();  
  25.     }  
  26.     //打开wifi  
  27.     public void openWifi(){  
  28.         if(!mWifiManager.isWifiEnabled()){  
  29.             mWifiManager.setWifiEnabled(true);  
  30.         }  
  31.     }  
  32.     //关闭wifi  
  33.     public void closeWifi(){  
  34.         if(!mWifiManager.isWifiEnabled()){  
  35.             mWifiManager.setWifiEnabled(false);  
  36.         }  
  37.     }  
  38.      // 检查当前wifi状态    
  39.     public int checkState() {    
  40.         return mWifiManager.getWifiState();    
  41.     }    
  42.     //锁定wifiLock  
  43.     public void acquireWifiLock(){  
  44.         mWifiLock.acquire();  
  45.     }  
  46.     //解锁wifiLock  
  47.     public void releaseWifiLock(){  
  48.         //判断是否锁定  
  49.         if(mWifiLock.isHeld()){  
  50.             mWifiLock.acquire();  
  51.         }  
  52.     }  
  53.     //创建一个wifiLock  
  54.     public void createWifiLock(){  
  55.         mWifiLock=mWifiManager.createWifiLock("test");  
  56.     }  
  57.     //得到配置好的网络  
  58.     public List<WifiConfiguration> getConfiguration(){  
  59.         return mWifiConfigurations;  
  60.     }  
  61.     //指定配置好的网络进行连接  
  62.     public void connetionConfiguration(int index){  
  63.         if(index>mWifiConfigurations.size()){  
  64.             return ;  
  65.         }  
  66.         //连接配置好指定ID的网络  
  67.         mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId, true);  
  68.     }  
  69.     public void startScan(){  
  70.         mWifiManager.startScan();  
  71.         //得到扫描结果  
  72.         mWifiList=mWifiManager.getScanResults();  
  73.         //得到配置好的网络连接  
  74.         mWifiConfigurations=mWifiManager.getConfiguredNetworks();  
  75.     }  
  76.     //得到网络列表  
  77.     public List<ScanResult> getWifiList(){  
  78.         return mWifiList;  
  79.     }  
  80.     //查看扫描结果  
  81.     public StringBuffer lookUpScan(){  
  82.         StringBuffer sb=new StringBuffer();  
  83.         for(int i=0;i<mWifiList.size();i++){  
  84.             sb.append("Index_" + new Integer(i + 1).toString() + ":");  
  85.              // 将ScanResult信息转换成一个字符串包    
  86.             // 其中把包括:BSSID、SSID、capabilities、frequency、level    
  87.             sb.append((mWifiList.get(i)).toString()).append("\n");  
  88.         }  
  89.         return sb;    
  90.     }  
  91.     public String getMacAddress(){  
  92.         return (mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();  
  93.     }  
  94.     public String getBSSID(){  
  95.         return (mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();  
  96.     }  
  97.     public int getIpAddress(){  
  98.         return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();  
  99.     }  
  100.     //得到连接的ID  
  101.     public int getNetWordId(){  
  102.         return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();  
  103.     }  
  104.     //得到wifiInfo的所有信息  
  105.     public String getWifiInfo(){  
  106.         return (mWifiInfo==null)?"NULL":mWifiInfo.toString();  
  107.     }  
  108.     //添加一个网络并连接  
  109.     public void addNetWork(WifiConfiguration configuration){  
  110.         int wcgId=mWifiManager.addNetwork(configuration);  
  111.         mWifiManager.enableNetwork(wcgId, true);  
  112.     }  
  113.     //断开指定ID的网络  
  114.     public void disConnectionWifi(int netId){  
  115.         mWifiManager.disableNetwork(netId);  
  116.         mWifiManager.disconnect();  
  117.     }  
  118. }  


WifiActivity类:

[html] view plaincopy
  1. import java.util.List;  
  2.   
  3. import android.app.Activity;  
  4. import android.net.wifi.ScanResult;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10. import android.widget.Toast;  
  11.   
  12. public class WifiActivity extends Activity {  
  13.     /** Called when the activity is first created. */  
  14.       private TextView allNetWork;    
  15.         private Button scan;    
  16.         private Button start;    
  17.         private Button stop;    
  18.         private Button check;    
  19.         private WifiAdmin mWifiAdmin;    
  20.         // 扫描结果列表    
  21.         private List<ScanResult> list;    
  22.         private ScanResult mScanResult;    
  23.         private StringBuffer sb=new StringBuffer();    
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.main);  
  28.         mWifiAdmin = new WifiAdmin(WifiActivity.this);    
  29.         init();    
  30.     }  
  31.     public void init(){  
  32.         allNetWork = (TextView) findViewById(R.id.allNetWork);    
  33.         scan = (Button) findViewById(R.id.scan);    
  34.         start = (Button) findViewById(R.id.start);    
  35.         stop = (Button) findViewById(R.id.stop);    
  36.         check = (Button) findViewById(R.id.check);   
  37.         scan.setOnClickListener(new MyListener());    
  38.         start.setOnClickListener(new MyListener());    
  39.         stop.setOnClickListener(new MyListener());    
  40.         check.setOnClickListener(new MyListener());    
  41.     }  
  42.     private class MyListener implements OnClickListener{  
  43.   
  44.         @Override  
  45.         public void onClick(View v) {  
  46.             // TODO Auto-generated method stub  
  47.             switch (v.getId()) {  
  48.             case R.id.scan://扫描网络  
  49.                   getAllNetWorkList();    
  50.                 break;  
  51.            case R.id.start://打开Wifi  
  52.                 mWifiAdmin.openWifi();  
  53.                 Toast.makeText(WifiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();  
  54.                 break;  
  55.            case R.id.stop://关闭Wifi  
  56.                 mWifiAdmin.closeWifi();  
  57.                 Toast.makeText(WifiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();  
  58.                 break;  
  59.            case R.id.check://Wifi状态  
  60.                Toast.makeText(WifiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();  
  61.                 break;  
  62.             default:  
  63.                 break;  
  64.             }  
  65.         }  
  66.           
  67.     }  
  68.     public void getAllNetWorkList(){  
  69.           // 每次点击扫描之前清空上一次的扫描结果    
  70.         if(sb!=null){  
  71.             sb=new StringBuffer();  
  72.         }  
  73.         //开始扫描网络  
  74.         mWifiAdmin.startScan();  
  75.         list=mWifiAdmin.getWifiList();  
  76.         if(list!=null){  
  77.             for(int i=0;i<list.size();i++){  
  78.                 //得到扫描结果  
  79.                 mScanResult=list.get(i);  
  80.                 sb=sb.append(mScanResult.BSSID+"  ").append(mScanResult.SSID+"   ")  
  81.                 .append(mScanResult.capabilities+"   ").append(mScanResult.frequency+"   ")  
  82.                 .append(mScanResult.level+"\n\n");  
  83.             }  
  84.             allNetWork.setText("扫描到的wifi网络:\n"+sb.toString());  
  85.         }  
  86.     }  
  87. }  

  1. <!-- 以下是使用wifi访问网络所需的权限 -->    
  2.    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>    
  3.  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>    
  4.  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>    
  5.  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 




经过查看网上的资料,知道在手机屏幕关闭之后,并且其他的应用程序没有在使用wifi的时候,系统大概在两分钟之后,会关闭wifi,使得wifi处于睡眠状态。

这样的做法,有利于电源能量的节省和延长电池寿命等。

android为wifi提供了一种叫WifiLock的锁,能够阻止wifi进入睡眠状态,使wifi一直处于活跃状态。这种锁,在下载一个较大的文件的时候,比较适合使用。

WifiLock Allows an application to keep the Wi-Fi radio awake.

一、创建一个wifiLock

1. 

[java] view plaincopy
  1. /** 
  2.  *  
  3.  * @param lockName 
  4.  *            锁的名字 
  5.  * @return wifiLock 
  6.  */  
  7. public WifiLock createWifiLock(String lockName)  
  8. {  
  9.     wifiLock = wifiManager.createWifiLock(lockName);  
  10.     return wifiLock;  
  11.   
  12. }  
 2. 

[java] view plaincopy
  1. /** 
  2.      *  
  3.      * @param lockName 
  4.      *            锁的名称 
  5.      * @param lockType 
  6.      *  
  7.      *            WIFI_MODE_FULL == 1 <br/> 
  8.      *            扫描,自动的尝试去连接一个曾经配置过的点<br /> 
  9.      *            WIFI_MODE_SCAN_ONLY == 2 <br/> 
  10.      *            只剩下扫描<br /> 
  11.      *            WIFI_MODE_FULL_HIGH_PERF = 3 <br/> 
  12.      *            在第一种模式的基础上,保持最佳性能<br /> 
  13.      * @return wifiLock 
  14.      */  
  15.     public WifiLock createWifiLock(String lockName, int lockType)  
  16.     {  
  17.         wifiLock = wifiManager.createWifiLock(lockType, lockName);  
  18.         return wifiLock;  
  19.     }  

二、给wifi添加锁

[java] view plaincopy
  1. /** 
  2.  * 加上锁 
  3.  */  
  4. public void lockWifi()  
  5. {  
  6.     wifiLock.acquire();  
  7. }  

三、给wifi释放锁

[java] view plaincopy
  1. /** 
  2.  * 释放锁 
  3.  */  
  4. public void releaseLock()  
  5. {  
  6.     if (wifiLock.isHeld())  
  7.     {  
  8.         wifiLock.release();  
  9.     }  
  10. }  

四、判断wifi是否被lock锁持用

[java] view plaincopy
  1. /** 
  2.  * 判断wifi的锁是否持有 
  3.  *  
  4.  * @return 
  5.  */  
  6. public boolean isHeld()  
  7. {  
  8.     return wifiLock.isHeld();  
  9. }  


关于自动连接wifi

在这篇文章中,作者定义了一个wifi工具类,其中存在着操作wifi的各种方法,其中有一些错误我以改正,正确的代码如下(创建一个名为WifiAdmin.java的文件,以下代码中没有包声明和import,请自行添加):

[java] 
public class WifiAdmin {  
    // 定义WifiManager对象   
    private WifiManager mWifiManager;  
    // 定义WifiInfo对象   
    private WifiInfo mWifiInfo;  
    // 扫描出的网络连接列表   
    private List<ScanResult> mWifiList;  
    // 网络连接列表   
    private List<WifiConfiguration> mWifiConfiguration;  
    // 定义一个WifiLock   
    WifiLock mWifiLock;  
 
  
    // 构造器   
    public WifiAdmin(Context context) {  
        // 取得WifiManager对象   
        mWifiManager = (WifiManager) context  
                .getSystemService(Context.WIFI_SERVICE);  
        // 取得WifiInfo对象   
        mWifiInfo = mWifiManager.getConnectionInfo();  
    }  
  
    // 打开WIFI   
    public void openWifi() {  
        if (!mWifiManager.isWifiEnabled()) {  
            mWifiManager.setWifiEnabled(true);  
        }  
    }  
  
    // 关闭WIFI   
    public void closeWifi() {  
        if (mWifiManager.isWifiEnabled()) {  
            mWifiManager.setWifiEnabled(false);  
        }  
    }  
  
    // 检查当前WIFI状态   
    public int checkState() {  
        return mWifiManager.getWifiState();  
    }  
  
    // 锁定WifiLock   
    public void acquireWifiLock() {  
        mWifiLock.acquire();  
    }  
  
    // 解锁WifiLock   
    public void releaseWifiLock() {  
        // 判断时候锁定   
        if (mWifiLock.isHeld()) {  
            mWifiLock.acquire();  
        }  
    }  
  
    // 创建一个WifiLock   
    public void creatWifiLock() {  
        mWifiLock = mWifiManager.createWifiLock("Test");  
    }  
  
    // 得到配置好的网络   
    public List<WifiConfiguration> getConfiguration() {  
        return mWifiConfiguration;  
    }  
  
    // 指定配置好的网络进行连接   
    public void connectConfiguration(int index) {  
        // 索引大于配置好的网络索引返回   
        if (index > mWifiConfiguration.size()) {  
            return;  
        }  
        // 连接配置好的指定ID的网络   
        mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,  
                true);  
    }  
  
    public void startScan() {  
        mWifiManager.startScan();  
        // 得到扫描结果   
        mWifiList = mWifiManager.getScanResults();  
        // 得到配置好的网络连接   
        mWifiConfiguration = mWifiManager.getConfiguredNetworks();  
    }  
  
    // 得到网络列表   
    public List<ScanResult> getWifiList() {  
        return mWifiList;  
    }  
  
    // 查看扫描结果   
    public StringBuilder lookUpScan() {  
        StringBuilder stringBuilder = new StringBuilder();  
        for (int i = 0; i < mWifiList.size(); i++) {  
            stringBuilder  
                    .append("Index_" + new Integer(i + 1).toString() + ":");  
            // 将ScanResult信息转换成一个字符串包   
            // 其中把包括:BSSID、SSID、capabilities、frequency、level   
            stringBuilder.append((mWifiList.get(i)).toString());  
            stringBuilder.append("/n");  
        }  
        return stringBuilder;  
    } 
  
    // 得到MAC地址   
    public String getMacAddress() {  
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();  
    }  
  
    // 得到接入点的BSSID   
    public String getBSSID() {  
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();  
    }  
  
    // 得到IP地址   
    public int getIPAddress() {  
        return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();  
    }  
  
    // 得到连接的ID   
    public int getNetworkId() {  
        return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();  
    }  
  
    // 得到WifiInfo的所有信息包   
    public String getWifiInfo() {  
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();  
    }  
  
    // 添加一个网络并连接   
    public void addNetwork(WifiConfiguration wcg) {  
     int wcgID = mWifiManager.addNetwork(wcg);  
     boolean b =  mWifiManager.enableNetwork(wcgID, true);  
     System.out.println("a--" + wcgID); 
     System.out.println("b--" + b); 
    }  
  
    // 断开指定ID的网络   
    public void disconnectWifi(int netId) {  
        mWifiManager.disableNetwork(netId);  
        mWifiManager.disconnect();  
    }  
  
//然后是一个实际应用方法,只验证过没有密码的情况: 
  
    public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type)  
    {  
          WifiConfiguration config = new WifiConfiguration();    
           config.allowedAuthAlgorithms.clear();  
           config.allowedGroupCiphers.clear();  
           config.allowedKeyManagement.clear();  
           config.allowedPairwiseCiphers.clear();  
           config.allowedProtocols.clear();  
          config.SSID = "\"" + SSID + "\"";    
           
          WifiConfiguration tempConfig = this.IsExsits(SSID);            
          if(tempConfig != null) {   
              mWifiManager.removeNetwork(tempConfig.networkId);   
          } 
           
          if(Type == 1) //WIFICIPHER_NOPASS 
          {  
               config.wepKeys[0] = "";  
               config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);  
               config.wepTxKeyIndex = 0;  
          }  
          if(Type == 2) //WIFICIPHER_WEP 
          {  
              config.hiddenSSID = true; 
              config.wepKeys[0]= "\""+Password+"\"";  
              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 == 3) //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;    
          } 
           return config;  
    }  
     
    private WifiConfiguration IsExsits(String SSID)   
    {   
        List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();   
           for (WifiConfiguration existingConfig : existingConfigs)    
           {   
             if (existingConfig.SSID.equals("\""+SSID+"\""))   
             {   
                 return existingConfig;   
             }   
           }   
        return null;    
    } 
   

//分为三种情况:1没有密码2用wep加密3用wpa加密 

改动主要集中在CreateWifiInfo这个方法中,并且添加了一个私有方法:

(1)将与方法的第三个参数有关的变量都改成int型,或者使用原作者的枚举型(存在bug需要改正),但枚举会在后续的开发中遇到些困难;

(2)在if(type == 3)中注释掉“config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);”,并添加“

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);“这两句,否则当wifi热点需要输入密码时,无法加入网络。

(3)在代码末尾添加了方法IsExsits,原因在于如果按照网上介绍的方法成功加入指定的wifi后,都会在终端的wifi列表中新添加一个以该指定ssid的网络,所以每运行一次程序,列表中就会多一个相同名字的ssid。而该方法就是检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在CreateWifiInfo方法开始配置wifi网络之前将其移除,以避免ssid的重复:

WifiConfiguration tempConfig = this.IsExsits(SSID);          

          if(tempConfig != null) { 

          mWifiManager.removeNetwork(tempConfig.networkId); 

          }

以上便是wifi工具类的建立,之后就可以在其他部分实例化这个类,调用其中的方法完成加入指定ssid的wifi热点,还是先上代码吧,建立一个名为Test_wifiActivity.java的文件(同上,没有包含包声明和import语句):

[java] 
public class Test_wifiActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        WifiAdmin wifiAdmin = new WifiAdmin(this); 
        wifiAdmin.openWifi(); 
        wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo("XXX", "XXX", 3)); 
    } 

很简单,如果是接入wifi,大体上只涉及到openWifi(打开wifi)、CreateWifiInfo(配置wifi网络信息)和addNetwork(添加配置好的网络并连接),对CreateWifiInfo进行简单的说明:第一参数是SSID的名称;第二个参数是指定SSID网络的密码,当不需要密码是置空(”“);第三个参数是热点类型:1-无密码 / 2-WEP密码验证(未测试)/ 3-WAP或WAP2 PSK密码验证。
最后就是在Manifest中添加相应的权限了:

[java] 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission> 

如果按照上述的方法进行开发,就可以很傻瓜的通过改变Test_wifiActivity.java中的CreateWifiInfo方法的三个入口参数实现加入指定SSID的wifi热点了,无论该热点是否需要密码认证。
以上就是我对于自动连接指定SSID的wifi热点的学习心得,



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值