最近在做關於藍牙傳送數據 連接WiFi的應用,稍後會有代碼個解析 一下是轉載的
裏面遇到的問題 我也遇到了,親測 是可用的,網上百分之九十以上都是有問題的。想解決的 都自己好好讀讀吧。
https://bxbxbai.github.io/2014/05/22/android-wifi-connection/
急速傳歌這個功能需要App能夠自動去連接另一個手機創建的熱點,本文先說Wifi創建熱點以及連接Wifi的原理,然後再講我遇到的問題和我是怎麼解決問題的。
B手機創建熱點是一個自動的過程,A手機去連接B手機的熱點也是一個自動的過程,此時手機B充當路由器的角色。
自動連接Wifi功能,就像我們通過系統設置WLAN裏面,選擇一個Wifi並且輸入密碼(如果有密碼)的過程一樣,只不過App知道了這個Wifi(帶某個前綴)的密碼,然後通過相關設置,可以自動去連接。
Android應用如何自動鏈接Wifi
Android開發裏操作Wifi功能的api就在android.net.wifi.WifiManager
這個類中,包括:
getConnectionInfo()
獲取當前Wifi連接信息,返回WifiInfo
對象,包括SSID
,BSSID
,networkId
,ipAddress
,macAddress
等信息disableNetwork(int netId)
禁用這個network(即使Wifi掃描到這個熱點也不會主動去連接),參數netId
就是WifiInfo
中的networkId
值disconnect()
斷開當前連接getConfiguredNetworks()
返回已經保存的Wifi網絡列表,返回值是List<WifiConfiguration>
updateNetwork(WifiConfiguration config)
更新Wifi配置,比如更新密碼或網絡的優先級addNetwork(WifiConfiguration config)
添加一個新的Wifi配置,當我們在設置->WLAN中選擇一個網絡並輸入密碼連接後,系統會自動幫我們記住這個網絡,這個方法返回int
,是networkId
值enableNetwork(int netId, boolean disableOthers)
調用這個方法後,一般手機會去自動去連接這個wifi網絡,但是部分手機會連接失敗saveConfiguration()
; 部分手機的連接失敗reconnect()
;
Android應用如何創建一個熱點
Android開發中,創建熱點的方法也是在WifiManager
類中,不過都已經被Google @hide
了。
@hide
annotation就是Google隱藏了不穩定的方法,當穩定之後,自然會公開,如果我們現在要用這些方法,那麼必須通過Java反射來調用
創建一個熱點最重要的就是:配置一個WifiConfiguration
對象,通過配置
SSID
: 熱點的名字preSharedKey
熱點密碼hiddenSSID
: 是否隱藏SSIDstatus
:是否啓用這個熱點配置allowedAuthAlgorithms
:IEEE 802.11認證算法 OPENallowedGroupCiphers
:組祕鑰TKIP+CCMPallowedPairwiseCiphers
:對稱祕鑰TKIP+CCMPallowedKeyManagement
:祕鑰管理WPA_PSKallowedProtocols
:加密協議WPA+RSN
啓動熱點也需要通過Java反射調用WifiManager
類中的setWifiApEnabled(WifiConfiguration
wifiConfig, boolean enabled)
方法,第一個參數就是前面配置的WifiConfiguration
對象,第二個參數true
表示打開,false
表示關閉熱點。
當時連接wifi的主要的代碼就是,先配置好WifiConfiguration
對象,然後就是添加向添加一個WifiConfiguration
,這樣就會返回這個Wifi配置的id
,然後就enable
這個Wifi配置,到此爲止,一般的手機都可以連接成功
int networkId = mWifiManager.addNetwork(wifiConfig);
boolean enabled = mWifiManager.enableNetwork(networkId, true);
我遇到的第一個問題:
手機A不能自動的去連接手機B創建的熱點,那麼問題是手機B創建的熱點有問題還是手機A連接熱點的配置信息有問題?但是手機C又可以去連接手機B的熱點,那麼是否說明手機B的熱點創建就沒問題了呢?
試了很多手機之後,發現都可以連接到手機B的熱點,那麼我們初步判定就是手機A 的連接Wifi配置信息有問題!後來,我就用手機A系統設置裏的Wifi連接功能去連接手機B的熱點,可以連接!那麼問題就是手機A 連接熱點的配置有問題!
問題又來了:
同樣的Wifi配置信息,爲什麼大部分手機都可以連接熱點成功,而一些手機就不可以呢?而連接Wifi的方法都是在WifiMnager
類中
我看到了一個方法public void connect(WifiConfiguration config, ActionListener listener)
方法,看文檔就是用來連接Wifi的!!!!但不幸的是,這個方法被@hide
了!!!!肯跌啊@_@還好,在文檔中可以看到:
For a new network, this function is used instead of a sequence of
addNetwork()
,enableNetwork()
,saveConfiguration()
andreconnect()
而這4個方法是pulic並且沒有@hide
的!!然後按照文檔寫的,再添加兩行代碼:
非常關鍵的兩行代碼,有些手機必須要在saveConfiguration操作之後才能成功連接熱點
mWifiManager.saveConfiguration();
mWifiManager.reconnect();
手機A就可以連接成功了!!
我遇到的第二個問題:
HTC手機創建熱點時熱點的配置信息中的熱點名字不起作用!HTC手機可以成功自動連接Wifi,也可以創建熱點,但是不能改熱點的名字!!這就導致了其他所有手機都不能自動連HTC手機的熱點!那麼問題顯而易見就是創建熱點的時候信息配置有問題!!那麼爲什麼配置有問題呢?其他手機不是都可以的嗎?
問題大致已經找到了,但是爲什麼這樣呢?必須求助強大的Google了~~~經過一番搜索之後重要找到了!!!
WIFI熱點設置,htc
setWifiApEnabled Wificonfiguration
HTC
通過 WifiConfiguration 修改 SSID
原因就在於: HTC就喜歡自己去改一些Android系統的api,導致很多手機都可以正常運行的功能,到了HTC手機上就不能正常運行了!!!這不是肯跌嗎?(╯‵□′)╯︵┻━┻
找到原因也找到了解決辦法,這個bug就這麼愉快的解決了~真的多謝強大的Google啊~~
說到最後
我們做事情過程中,一定會遇到很多各種各樣的問題,
找到問題的原因(爲什麼會這樣)比怎樣去解決重要的多
怎樣把大象放進冰箱呢? 打開冰箱,然後把大象放進去!
怎麼解決問題呢?
先找到問題的原因,然後在找解決問題的辦法
還是那句話,找到問題的原因比找到解決問題的辦法更重要.
找到問題所在的原因,如果你不能解決,那麼你可以求助於其他人,而當你不知道問題的原因的時候,你去求助別人的時候,別人還有幫你去找問題的原因,這肯定會浪費很多時間的。先不要找解決問題的辦法,先找問題的原因~