WIFI就是一種無線連網技術,常見的是使用無線路由器。那麼在這個無線路由器的訊號覆蓋的範圍內都可以採用WIFI串連的方式進行連網。如果無線路由器串連了一個ADSL線路或其他的連網線路,則又被稱為“熱點”。
在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 : 未知網卡狀態
下面先寫一個wifi的執行個體:
首先看以下main.xml:
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/scan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="掃描網路" /> <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="開啟Wifi" /> <Button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="關閉Wifi" /> <Button android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Wifi狀態" /> <TextView android:id="@+id/allNetWork" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="當前沒有掃描到Wifi網路" /> </LinearLayout></ScrollView>
接下來我們吧wifi的相關操作都封裝在了一個WifiAdmin類中,以後開啟或關閉等相關操作可以直接調用這個類的相關方法:
import java.util.List;import android.content.Context;import android.net.wifi.ScanResult;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.net.wifi.WifiManager.WifiLock;public class WifiAdmin { //定義一個WifiManager對象private WifiManager mWifiManager;//定義一個WifiInfo對象private WifiInfo mWifiInfo;//掃描出的網路連接列表private List<ScanResult> mWifiList;//網路連接列表private List<WifiConfiguration> mWifiConfigurations;WifiLock mWifiLock;public WifiAdmin(Context context){//取得WifiManager對象mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE);//取得WifiInfo對象mWifiInfo=mWifiManager.getConnectionInfo();}//開啟wifipublic void openWifi(){if(!mWifiManager.isWifiEnabled()){mWifiManager.setWifiEnabled(true);}}//關閉wifipublic void closeWifi(){if(!mWifiManager.isWifiEnabled()){mWifiManager.setWifiEnabled(false);}} // 檢查當前wifi狀態 public int checkState() { return mWifiManager.getWifiState(); } //鎖定wifiLockpublic void acquireWifiLock(){mWifiLock.acquire();}//解鎖wifiLockpublic void releaseWifiLock(){//判斷是否鎖定if(mWifiLock.isHeld()){mWifiLock.acquire();}}//建立一個wifiLockpublic void createWifiLock(){mWifiLock=mWifiManager.createWifiLock("test");}//得到配置好的網路public List<WifiConfiguration> getConfiguration(){return mWifiConfigurations;}//指定配置好的網路進行串連public void connetionConfiguration(int index){if(index>mWifiConfigurations.size()){return ;}//串連配置好指定ID的網路mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId, true);}public void startScan(){mWifiManager.startScan();//得到掃描結果mWifiList=mWifiManager.getScanResults();//得到配置好的網路連接mWifiConfigurations=mWifiManager.getConfiguredNetworks();}//得到網路列表public List<ScanResult> getWifiList(){return mWifiList;}//查看掃描結果public StringBuffer lookUpScan(){StringBuffer sb=new StringBuffer();for(int i=0;i<mWifiList.size();i++){sb.append("Index_" + new Integer(i + 1).toString() + ":"); // 將ScanResult資訊轉換成一個字串包 // 其中把包括:BSSID、SSID、capabilities、frequency、level sb.append((mWifiList.get(i)).toString()).append("\n");}return sb;}public String getMacAddress(){return (mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();}public String getBSSID(){return (mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();}public int getIpAddress(){return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();}//得到串連的IDpublic int getNetWordId(){return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();}//得到wifiInfo的所有資訊public String getWifiInfo(){return (mWifiInfo==null)?"NULL":mWifiInfo.toString();}//添加一個網路並串連public void addNetWork(WifiConfiguration configuration){int wcgId=mWifiManager.addNetwork(configuration);mWifiManager.enableNetwork(wcgId, true);}//斷開指定ID的網路public void disConnectionWifi(int netId){mWifiManager.disableNetwork(netId);mWifiManager.disconnect();}}
最後看以下WifiActivity類:
import java.util.List;import android.app.Activity;import android.net.wifi.ScanResult;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class WifiActivity extends Activity { /** Called when the activity is first created. */ private TextView allNetWork; private Button scan; private Button start; private Button stop; private Button check; private WifiAdmin mWifiAdmin; // 掃描結果清單 private List<ScanResult> list; private ScanResult mScanResult; private StringBuffer sb=new StringBuffer(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mWifiAdmin = new WifiAdmin(WifiActivity.this); init(); } public void init(){ allNetWork = (TextView) findViewById(R.id.allNetWork); scan = (Button) findViewById(R.id.scan); start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); check = (Button) findViewById(R.id.check); scan.setOnClickListener(new MyListener()); start.setOnClickListener(new MyListener()); stop.setOnClickListener(new MyListener()); check.setOnClickListener(new MyListener()); } private class MyListener implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.scan://掃描網路 getAllNetWorkList(); break; case R.id.start://開啟Wifi mWifiAdmin.openWifi();Toast.makeText(WifiActivity.this, "當前wifi狀態為:"+mWifiAdmin.checkState(), 1).show();break; case R.id.stop://關閉WifimWifiAdmin.closeWifi();Toast.makeText(WifiActivity.this, "當前wifi狀態為:"+mWifiAdmin.checkState(), 1).show();break; case R.id.check://Wifi狀態 Toast.makeText(WifiActivity.this, "當前wifi狀態為:"+mWifiAdmin.checkState(), 1).show();break;default:break;}} } public void getAllNetWorkList(){ // 每次點擊掃描之前清空上一次的掃描結果 if(sb!=null){ sb=new StringBuffer(); } //開始掃描網路 mWifiAdmin.startScan(); list=mWifiAdmin.getWifiList(); if(list!=null){ for(int i=0;i<list.size();i++){ //得到掃描結果 mScanResult=list.get(i); sb=sb.append(mScanResult.BSSID+" ").append(mScanResult.SSID+" ") .append(mScanResult.capabilities+" ").append(mScanResult.frequency+" ") .append(mScanResult.level+"\n\n"); } allNetWork.setText("掃描到的wifi網路:\n"+sb.toString()); } }}
不要忘了加入許可權:
<!-- 以下是使用wifi訪問網路所需的許可權 --> <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>
最後看以下示範效果:
點擊開啟wifi:
狀態為3說明WIFI網卡可用(3)。點擊掃描網路:
這些就是掃描到的wifi,具體參數參見上面介紹。