Android應用程序創建熱點以及自動鏈接Wifi,我遇到的問題以及我是怎麼解決的


最近在做關於藍牙傳送數據 連接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對象,包括SSIDBSSIDnetworkIdipAddressmacAddress等信息
  • 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: 是否隱藏SSID
  • status:是否啓用這個熱點配置
  • allowedAuthAlgorithms:IEEE 802.11認證算法 OPEN
  • allowedGroupCiphers :組祕鑰TKIP+CCMP
  • allowedPairwiseCiphers:對稱祕鑰TKIP+CCMP
  • allowedKeyManagement:祕鑰管理WPA_PSK
  • allowedProtocols:加密協議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() and reconnect()

而這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啊~~

說到最後

我們做事情過程中,一定會遇到很多各種各樣的問題,

找到問題的原因(爲什麼會這樣)比怎樣去解決重要的多
怎樣把大象放進冰箱呢? 打開冰箱,然後把大象放進去!

怎麼解決問題呢?
先找到問題的原因,然後在找解決問題的辦法

還是那句話,找到問題的原因比找到解決問題的辦法更重要.

找到問題所在的原因,如果你不能解決,那麼你可以求助於其他人,而當你不知道問題的原因的時候,你去求助別人的時候,別人還有幫你去找問題的原因,這肯定會浪費很多時間的。先不要找解決問題的辦法,先找問題的原因~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章