1. 程式人生 > >android6.0 切換到指定wifi

android6.0 切換到指定wifi

遇到的問題:
1、在網上找到一個wifi工具類,寫了初步的切換到指定wifi的demo,測試後,一切ok。換到指定裝置的wifi,失敗了,點選連線,app無響應了。
2、wifi切換太慢了,同事覺得不穩定,繼續改。根據裝置的wifi加密模式,修改了建立wifi的方式,測試之後基本上都能連上,偶爾不能切換成功
3、最近一個偶然的機會又來測試wifi。額…..失敗了,並且一直切換不過去,簡直不是一般的難受。

官方文件才是正理

這裡寫圖片描述

上述切換失敗的原因
android6.0 只允許操作自己建立的WifiConfiguration。
上面遇到的問題在於自己對“個人建立建立WifiConfiguration” 理解不到位。以及對wifi加密模式的不清楚,我們的裝置是wpa2的加密模式,直接使用了wpa2的加密模式,切換速度比以前更快了,而且成功率也高了很多。

wifi的種類
wifi有兩種,一種是自己在程式碼裡面建立,一種是別人的.
別人的wifi:主要包括由使用者手動輸入密碼連線的wifi和其他app建立的wifi—這裡簡稱為系統wifi
自己的wifi:自己在app裡面建立的wifi—-這裡簡稱為個人wifi
連線成功了 則表示建立wifi成功了。

對wifi的操作
系統wifi:雖然可以通過wifiManager的savedConfiguration方法獲取到指定wifi對應的Configuration,但是並不能進行具體的操作,add該wifi,會直接返回-1(addNetwork(WifiConfigurationconfig)=-1),enableNetwork(config)時會導致app無響應,removeNetwork(config)=false,移除系統wifi也不會成功。詳見下列的測試過程。

個人wifi:可以進行add、enable、remove操作,詳見下列的測試過程 。

測試過程

WifiConfiguration wifiNewConfiguration = createWifiInfo(aimWifiName, aimWifiPwd);//使用wpa2的wifi加密方式
int newNetworkId = wifiManager.addNetwork(wifiNewConfiguration);
Log.e("MainActivity", "newNetworkId:" + newNetworkId);
/**
 * addNetwork列印結果:
 * 1、未儲存密碼               ==32
 * 2、在程式碼裡面儲存了密碼     ==32--意思是在程式碼裡面add了 沒有remove的情況
 * 3、手動連線了密碼           ==-1
 */
boolean enableNetwork = wifiManager.enableNetwork(newNetworkId, true);//newNetworId在作業系統wifi的時候,可以換成通過saveConfiguration中WifiConfiguration 獲取到networkId來繼續進行測試,這裡就忽略啦 Log.e("MainActivity", "enableNetwork:" + enableNetwork); /** * enableNetwork列印結果: * 1、未儲存密碼 切換成功 * 2、在程式碼裡面儲存了密碼 切換成功 * 3、手動連線了密碼 app無響應了 */

解決方案

android6.0 執行時環境在demo裡面。

//最終解決方案
WifiConfiguration wifiNewConfiguration = createWifiInfo(aimWifiName, aimWifiPwd);//使用wpa2的wifi加密方式
int newNetworkId = mWifiManager.addNetwork(wifiNewConfiguration);
if (newNetworkId == -1) {
    Log.e("MainActivity", "操作失敗,需要您到手機wifi列表中取消對裝置連線的儲存");
} else {
    boolean enableNetwork = mWifiManager.enableNetwork(newNetworkId, true);
    if (!enableNetwork) {
        Log.e("MainActivity", "切換到指定wifi失敗");
    } else {
        Log.e("MainActivity", "切換到指定wifi成功");
    }
}

demo地址