Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Wi-Fi基本操作

Android Wi-Fi基本操作

編輯:關於Android編程

從用戶角度看,Android Wi-Fi模塊自下向上可以看為5層:硬件驅動程序,wpa_suppplicant,JNI,WiFi API,WifiSettings應用程序。

1.wpa_supplicant是一個開源庫,是android實現Wi-Fi功能的基礎,它從上層接到命令後,通過Socket與硬件驅動進行通訊,操作硬件完成需要的操作。

2.JNI(Java Native Interface)實現了java代碼與其他代碼的交互,使得在java虛擬機中運行的java代碼能夠與其他語言編寫的應用程序和庫進行交互,在android中,JNI可以讓java程序調用C程序。

3.Wi-Fi API使應用程序可以使用Wi-Fi的功能。

4.Wi-FI Settings應用程序是android中自帶的一個應用程序,選擇手機的Settings->WireLess & netWorks->Wi-Fi,可以讓用戶手動打開或關閉Wi-Fi功能。當用戶打開Wi-Fi功能後,它會自動搜索周圍的無線網絡,並以列表的形式顯示,供用戶選擇。默認會連接用戶上一次成功連接的無線網絡。

在android.net.wifi包中提供了一些類管理設備的Wi-Fi功能。主要包括ScanResult,wifiConfiguration,WifiInfo,WifiManager.

1.ScanResult

ScanResult主要是通過Wi-Fi硬件的掃描來獲取一些周邊的Wi-Fi熱點的信息。該類包括以下五個域:

返回類型 域名 解釋 public String BSSID 接入點地址 public String SSID 網絡的名稱 public String capabilities 網絡性能,包括介入點支持的認證,密鑰管理,加密機制等 public int frequency 以MHz為單位的接入頻率 public int level 以dBm為單位的信號強度

 

 

 

 

 

該類還提供了一個方法toString(),可將結果轉換為簡潔,易讀的字符串形式。

2.wifiConfiguration類

通過該類可獲取一個Wi-Fi網絡的網絡配置,包括安全配置等。該類包括六個子類,如下:

子類 解釋 WifiConfiguration.AuthAlgorthm 獲取IEEE802.11的加密方法 WifiConfiguration.GroupCipher 獲取組密鑰 WifiConfiguration.KeyMgmt 獲取密碼管理機制 WifiConfiguration.PairwiseCipher 獲取WPA方式的成對密鑰 WifiConfiguration.Protocol 獲取機密協議 WifiConfiguration.Status 獲取當前網絡狀態

 

 

 

 

 

每個子類都以常量形式給出相關的配置信息,有些還包括含域和方法。

3.WifiInfo類

通過該類可以獲取已經建立或處於活動狀態的Wi-Fi網絡的狀態信息。該類提供的方法較多,部分常用的如下:

方法 解釋 getBSSIS() 獲取當前接入點的BSSID getIpAddress() 獲取IP地址 getLinkSpeed() 獲取當前連接的速度 getMacAddress() 獲取MAC地址 getRssi() 獲得802.11n網絡的信號強度指示 getSSID() 獲得網絡SSID getSupplicanState() 返回客戶端狀態的信息

 

 

 

 

 

 

4.wifiManager類

該類用於管理Wi-Fi連接,其定義了26個常量和23個方法。下面列出常用方法:

方法      解釋 addNetwork(WifiConfiguration config) 向設置好的網絡裡添加新網絡 calculateSignalLevel(int rssi,int numLevels) 計算信號的等級 compareSignalLevel(int rssiA,int rssiB) 對比兩個信號的強度 createWifiLock(int lockType,String tag) 創建一個Wi-Fi鎖,鎖定當前的Wi-Fi連接 disableNetWork(int netId) 讓一個網絡連接失敗 disconnect() 與當前接入點斷連接 enableNetwork(int netId,Boolean disableOthers) 與之前設置好的網絡建立連接 getConfiguredNetworks() 客戶端獲取網絡連接狀態 getConnectionInfo() 獲取當前連接信息 getDhcpInfo() 獲取DHCP信息 getScanResult() 獲取掃描測試結果 getWifiState() 獲取一個Wi-Fi接入點是否有效 isWifiEnabled() 判斷一個Wi-Fi連接是否有效 pingSupplicant() 看看客戶後台程序是否響應請求 ressociate() 重連到接入點,即使已經連接上了 reconnect() 如果現在沒有連接的話,則重連接 removeNetwork(int netId) 移出某一個特定網絡 saveConfiguration() 保留一個配置信息 setWifiEnabled(boolean enabled) 讓一個連接有效或失效 startScan() 開始掃描 updateNetwork(WifiConfiguration config) 更新一個網絡連接信息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

需要指出的是,Wi-Fi網卡狀態是由一系列的整型常量來表示的。

WIFI_STATE_DISABLED:Wi-Fi網卡不可用,用整型常量1表示。

WIFI_STATE_DISABLING:Wi-Fi網卡正在關閉,用整型常量0表示。

WIFI_STATE_ENABLED:Wi-Fi網卡可用,用整型常量3表示。

WIFI_STATE_ENABLING:Wi-Fi網卡正在打開,啟動需要一段時間,用整型常量2表示。

WIFI_STATE_UNKNOWN:未知網卡狀態,用整型常量4表示。

此外wifiManager還提供了一個子類wifiManagerLock.wifiManagerLock的作用是這樣的:在普通的狀態下,如果Wi-Fi的狀態處於閒置,那麼網絡將會暫時中斷;但是如果把當前的網絡狀態鎖上,那麼Wi-Fi連通將會保持在一定的狀態,在結束鎖定之後,才會恢復常態。

下面簡單介紹一些方法的調用方式

private WifiInfo mWifiInfo;

private WifiManager mWifiManager;

1.獲取WifiManager系統服務

mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);

2.重新獲取當前Wi-Fi的連接信息

public void againGetWifiInfo(){

  mWifiInfo=mWifiManager.getConnectionInfo();

}

3.判斷用戶是否開啟wi-fi網卡

public boolean isNetCardFriendly(){

  return mWifiManager.isWifiEnabled();

}

4.判斷當前是否連接Wi-Fi

private State state;

//創建連接管理器

private ConnectivityManager connManager;

public boolean isConnectioning(){

  state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

  if(State.CONNECTING==state){

    return true;

  }else{

    return false;

  }

}

5.得到當前網絡的連接狀態

public State getCurrentState(){

  state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

  return state;

}

6.設置配置好的網絡(有密碼的網絡並配置好密碼),指定的

//網絡連接列表

private List wifiConfigList=new ArrayList();

//Wi-Fi配置列表

private List wifiConfigedSpecifiedList=new ArrayList();

public void setWifiConfigedSpecifiedList(String ssid){

  wifiConfigedSpecifiedList.clear();

  if(wifiConfigList!=null){

    for(WifiConfiguration item : wifiConfigList){

      //如果是指定的網絡,就加入列表

      if(item.SSID.equalsIgnoreCase("\""+ssid+"\"")&& item.preSharedKey!=null){

        //添加到列表中

        wifiConfigedSpecifiedList.add(item);

      }

    }

  }

}

7.返回Wi-Fi設置列表

public List getWifiConfigedSpecifiedList(){

  return wifiConfigedSpecifiedList;

}

 

8.打開Wi-Fi網卡

public void openNetCard(){

  if(!mWifiManager.isWifiEnabled()){

    mWifiManager.setWifiEnabled(true);

  }

}

9.關閉Wi-Fi網卡

public void closeNetCard(){

  if(mWifiManager.isWifiEnabled()){

    mWifiManager.setWifiEnabled(false);

  }

}

10.檢查當前Wi-Fi網卡狀態

public void checkNetCardState(){

  if(mWifiManager.getWifiState()==0){

    Log.i("","網卡正在關閉");

  }else if(mWifiManager.getWifiState()==1){

    Log.i("","網卡已經關閉");

  }else if(mWifiManager.getWifiState()==2){

    Log.i("","網卡正在打開");

  }else if(mWifiManager.getWifiState()==3){

    Log.i("","網卡已經打開");  

  }else{

    Log.i("","沒有獲取到狀態");

  }

}

11.掃描周邊網絡

//保存掃描結果列表

public List listResult=new ArrayList();

public void scan(){

  //開始掃描

  mWifiManager.startScan();

  //獲取掃描結果

  listResult=mWifiManager.getScanResults();

  //掃描配置列表

  wifiConfigList=mWifiManager.getConfiguredNetworks();

  if(listResult!=null){

    //當前存在無線網絡

  }else{

    //當前區域沒有無線網絡  

  }

}

12.返回掃描結果

public List getListResult(){

  return listResult;

}

13.得到掃描結果

//存儲掃描結果

private StringBuffer mStringBuffer=new StringBuffer();

private ScanResult mScanResult;

public String getScanResult(){

  //每次點擊掃描之前清空上一次掃描結果

  if(mStringBuffer!=null){

    mStringBuffer=new StringBuffer();  

  }

  //開始掃描調用11的方法

  scan();

  listResult=mWifiManager.getScanResults();

  if(listResult!=null){

    for(int i=0;i

      mScanResult=listResult.get(i);

      //將需要的屬性連接到字符串裡面 

     mStringBuffer.append("NO.").append(i+1).append(" :").append(mScanResult.SSID).append("->").append(mScanResult.BSSID).append("->").append(mScanResult.capabilities).append("->").append(mScanResult.frequency).append("->").append(mScanResult.level).append("->").append(mScanResult.describeContents()).append("\n\n");

    }

  }

  return mStringBuffer.toString();

}

 

14.斷開當前連接的網絡

public void disconnectWifi(){

  //獲取網絡ID

  int newId=getNetworkId();

  //設置網絡不可用

  mWifiManager.disableNetWork(netId);

  //斷開網絡

  mWifiManager.disconnect();

  //設置Wi-Fi信息為NULL

  mWifiInfo=null;

}

 

15.檢查當前網絡狀態

public Boolean checkNetWorkState(){

  if(mWifiInfo!=null){

    return true;

  }else{

    return false;

  }

}

 

16.得到連接的ID

public int getNetworkId(){

  return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();

}

 

17.得到IP地址

public void getIPAddress(){

   return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();

}

18.鎖定WifiLock

WinfiLock mWifiLock;

public void acquireWifilock(){

  mWifiLock.acquire();

}

19.解鎖WifiLock

public void releaseWifiLock(){

  if(mWifiLock.isHeld()){

    mWifiLock.acquire();

  }

}

 

20.創建一個WifiLock

public void creatWifiLock(){

  mWifiLock=mWifiManager.createWifiLock("test");

}

 

21.得到配置好的網絡wpa_supplicant.conf中的內容,不管有沒有配置密碼

public List getConfiguration(){

  return wifiConfigList;

}

 

22.指定配置好的網絡連接

public Boolean connectConfiguration(int index)(){

  //所引大於配置好的網絡返回

  if(index>=wifiConfigList.size()){

    return false;

  }

  return mWifiManager.enableNetwork(wifiConfigedSpecifiedList.get(index).networkId,true);

}

 

23.得到MAX地址

public String getMacAddress(){

  return (mWifiInfo=null)?"":mWifiInfo.getMacAddress(); 

}

 

24.得到接入點BSSID

public String getBSSID(){

  return (mWifiInfo=null)?"NULL":mWifiInfo.getBSSID();

}

 

25.得到WifiInfo的所有信息包

public String getWifiInfo(){

  return (mWifiInfo=null)?"NULL":mWifiInfo.toString();

}

 

26.添加一個網絡並連接

public int addNetwork(WifiConfiguration g){

  //添加網絡

  int wcgID=mWifiManager.addNetwork(g);

  //設置添加的網絡可用

  mWifiManager.enableNetwork(wcgID,true);

  return wcgID;

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved