Android程式設計實現連線Wifi(運用Wifi 相關 API)
阿新 • • 發佈:2019-01-26
通過程式來實現wifi的自動連線。
這兩天對android的wifi功能研究了一下。下面共享出自己封裝的WifiConnect類。(這裡參考了ZXing開源專案中wifi模組)
首先,要了解android關於wifi的API.
如果你喜歡看English API,這是android關於wifi的API地址:
如果你一看英語就頭疼,這裡有關於wifi的api的中文解釋
切入正題,這裡貼出一個封裝了的類(WifiConnect),在例項化WifiConnect物件時,需要傳入一個WifiManager物件。WifiConnect類向外部提供一個Connect方法,引數是無線的SSID,password,還有加密型別。
package com.example.aptest;
import java.util.List;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
public class WifiConnect {
WifiManager wifiManager;
//定義幾種加密方式,一種是WEP,一種是WPA,還有沒有密碼的情況
public enum WifiCipherType
{
WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
}
//建構函式
public WifiConnect(WifiManager wifiManager)
{
this.wifiManager = wifiManager;
}
//開啟wifi功能
private boolean openWifi()
{
boolean bRet = true;
if (!wifiManager.isWifiEnabled())
{
bRet = wifiManager.setWifiEnabled(true);
}
return bRet;
}
//提供一個外部介面,傳入要連線的無線網
public boolean connect(String SSID, String Password, WifiCipherType Type)
{
if(!this.openWifi())
{
return false;
}
//開啟wifi功能需要一段時間(我在手機上測試一般需要1-3秒左右),所以要等到wifi
//狀態變成WIFI_STATE_ENABLED 的時候才能執行下面的語句
//WifiManager.WIFI_STATE_ENABLING 2
//WifiManager.WIFI_STATE_ENABLED 3
System.out.println("wifiManager.getWifiState()" + wifiManager.getWifiState());
while(wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING )
{
System.out.println("wifiManager.getWifiState" + wifiManager.getWifiState());
try{
//為了避免程式一直while迴圈,讓它睡個100毫秒在檢測……
Thread.currentThread();
Thread.sleep(100);
}
catch(InterruptedException ie){
}
}
WifiConfiguration wifiConfig = this.createWifiInfo(SSID, Password, Type);
//
if(wifiConfig == null)
{
return false;
}
WifiConfiguration tempConfig = this.isExsits(SSID);
if(tempConfig != null)
{
wifiManager.removeNetwork(tempConfig.networkId);
}
int netID = wifiManager.addNetwork(wifiConfig);
boolean bRet = wifiManager.enableNetwork(netID, false);
return bRet;
}
//檢視以前是否也配置過這個網路
private WifiConfiguration isExsits(String SSID)
{
List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs)
{
if (existingConfig.SSID.equals("\""+SSID+"\""))
{
return existingConfig;
}
}
return null;
}
private WifiConfiguration createWifiInfo(String SSID, String Password, WifiCipherType Type)
{
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + SSID + "\"";
if(Type == WifiCipherType.WIFICIPHER_NOPASS)
{
config.wepKeys[0] = "\"" + "\"";;
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
//或者下面兩段程式碼也可以
// config.hiddenSSID = true;
// config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}
else if(Type == WifiCipherType.WIFICIPHER_WEP)
{
config.wepKeys[0] = "\""+Password+"\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
else if(Type == WifiCipherType.WIFICIPHER_WPA)
{
config.preSharedKey = "\""+Password+"\"";
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
//config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); //這句好像不行
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
}
else
{
return null;
}
return config;
}
}
<!-- 以下是使用wifi訪問網路所需要的許可權-->
<manifest ...><uses-featureandroid:name="android.hardware.wifi"/>
...
</manifest>
以及:
android.permission.CHANGE_NETWORK_STATE //修改網路狀態的許可權
android.permission.CHANGE_WIFI_STATE //修改wifi狀態的許可權
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.ACCESS_NETWORK_STATE //訪問網路許可權
android.permission.ACCESS_WIFI_STATE //訪問wifi權