編輯:關於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
//Wi-Fi配置列表
private List
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
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
public void scan(){
//開始掃描
mWifiManager.startScan();
//獲取掃描結果
listResult=mWifiManager.getScanResults();
//掃描配置列表
wifiConfigList=mWifiManager.getConfiguredNetworks();
if(listResult!=null){
//當前存在無線網絡
}else{
//當前區域沒有無線網絡
}
}
12.返回掃描結果
public List
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
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;
}
關於Android中launchMode的文章介紹的真心不少,廣為流傳而且介紹的最詳細的莫過於這篇文章http://blog.csdn.net/android_tutor
1.我等屌絲喜歡簡單粗暴,首先來一幅圖哥們我是大陸人,當然默認語言是 中文簡體,但是我剛剛切換成了繁體了 2.看下配置文件,按照這個格式 ,看圖吧,簡單粗暴,別
理解事件的分發機制,需要對View和ViewGroup事件的分發分別探討。View和ViewGroup的區別,一個View控件是指它裡面不能再包含子控件了,常見的如Tex
由於最近工作需要,需要一個自定義插件,本人研究了很久終於做出一個最簡單的插件,是基於android平台來開發的,雖然寫博客很花時間,但是為了以後再次查看復習能很好的提供參