之前開發了一個WiFi,熱點相關的應用。因為對這方面也不熟悉,剛開始找資料看書,但看明白實現時,發現隨著android版本更新,相關api有較大改動,之前的代碼不能用。經過一番探索,最后實現出來了,現在把它記錄下來,希望能給需要的人一些幫助。
首先來講WiFi開發相關,那第一步肯定是如何來控制WiFi打開關閉狀態,以及如何來監聽其狀態變化。
WiFi連接控制類--WiFiManager
從官網參考可以知道它以下幾個作用:
- 獲取配置好的網絡,也就是之前連接過的WiFi;
- 對當前活動的WiFi網絡建立新連接或斷開,可以查詢有關網絡狀態;
- 周圍掃描到的接入點,對應類為ScanResult;
- 定義了在Wi-Fi狀態改變后發出廣播的intent action。
可以看出主要是用它來控制監聽WiFi狀態
打開關閉WiFi
對WiFi進行控制要聲明相關權限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
接著獲取WifiManager
mWifiManager= (WifiManager) getApplicationContext()
.getSystemService(Context.WIFI_SERVICE);
注意這里必須使用Application的上下文,那在fragment中獲取的話通過getActivity().getApplicationContext(),因為碎片中無法直接獲取Application Context
獲取到WifiManager后就可以通過isWifiEnabled()判斷是否打開,setWifiEnabled(boolean enabled)打開或關閉wifi,它的返回值說明操作結果,可能操作失敗
//set wifi switch state
swwifi.setChecked(mWifiManager.isWifiEnabled());
swwifi.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mWifiManager.setWifiEnabled(isChecked);
}
});
這里簡單的通過個switch顯示和控制開關狀態
WiFi狀態監聽
上面只是能在應用中控制wifi開關,但如果在外面wifi發生變化,應用內沒監聽的話,那相關顯示就錯誤了
監聽是通過WifiManager定義的一些action動態注冊廣播監聽(只能動態注冊)
//注冊接收器
private void registerBroadcast() {
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction()== WifiManager.WIFI_STATE_CHANGED_ACTION) {
switch (intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WIFI_STATE_UNKNOWN)) {
case WIFI_STATE_DISABLED:{
Toast.makeText(context, "WiFi disabled", Toast.LENGTH_SHORT).show();
swwifi.setChecked(false);
break;
}
case WIFI_STATE_DISABLING:{
Toast.makeText(context, "WiFi disabling", Toast.LENGTH_SHORT).show();
break;
}
case WIFI_STATE_ENABLED :{
Toast.makeText(context, "WiFi enabled", Toast.LENGTH_SHORT).show();
swwifi.setChecked(true);
break;
}
case WIFI_STATE_ENABLING:{
Toast.makeText(context, "WiFi enabling", Toast.LENGTH_SHORT).show();
break;
}
case WIFI_STATE_UNKNOWN:{
Toast.makeText(context, "WiFi state unknown", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
}, filter);
}
其他一些狀態也基本是通過動態注冊廣播監聽
上面有一點,剛打開注冊廣播時立即收到一條當前狀態的廣播