因項目需要Pad端和手機端交互,采用wifi直連。查閱資料,大概寫下一些資料和收獲吧。注:大公司的代碼帶不出來,我也比較懶不想再認真去寫一遍了,所以大概這個意思哦。
wifi直連也叫做wifi設備點對點連接(peer-peer),不需要連接熱點或者網絡,需要打開wifi,就可以查找到附近的設備。大概可以分為以下步驟:1.設置以下權限,並且注意最小sdk=14
2.創建一個廣播接收器,通過創建IntentFilter來addAction得到各個特定事件的發生來進行回調.
創建一個新的 BroadcastReceiver 類,用來監聽系統的Wi-Fi P2P狀態的改變(在 onReceive方法中,添加一個條件來處理上面列出的各種P2P狀態的變更。)
最后,在主活動激活時,注冊意圖過濾器(Intent Filter)和廣播接收器;在主活動暫停時把它們注銷。最好在onResume()和onPause()方法中完成該操作。
3.初始化得到WifiP2pManager和Channel實例,在onCreate()方法中初始化,如果是在Fragment中,initialize參數用Looper.getMainLooper(),

4.初始化搜索,只初始化了對等點的搜索。discoverPeers()方法啟動了搜索線程,並立刻返回。系統通過調用給定的動作監聽器的方法來進行初始化,並會在成功初始化對等點進程時通知你。同時,搜索也會持續進行,直到一個連接被初始化,或者一個P2P組形成。
5.獲取搜索到設備列表, 獲取對等點的列表並進行處理,首先實現 WifiP2pManager.PeerListListener 接口,它提供了Wi-Fi Direct檢測到的對等點信息。注:在公司當時我是在這個方法里實現自動連接,保存到sharedPreference,然后如果有搜索到相同的設備名和地址,代碼就不寫出來了,有更好的想法的可以說下。
在廣播onReceive()方法中以便在收到一個帶有 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION 動作的意圖(Intent)時調用 requestPeers方法。把實現PeerListListener的類作為方法參數傳進去進行監聽器回調。
6.連接(后面具體說)這個是重點哦
為了連接一個對等點,需要先創建一個新的 WifiP2pConfig 對象,然后從代表你想連接的設備的 WifiP2pDevice 中拷貝數據進去。再調用 connect 方法。然后項目需求是Pad端一定要作為group owner,這時候config.groupOwnerIntent = 15,增加這句話並不能一定作為group owner,只是一個建議。
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
為了兼容傳統的Wifi設備,Wifi_Direct其實還存在另一種使用方 式,暫且稱為兼容模式。兼容模式的特點在於,只需要擔任GroupOwner的設備支持Wifi_Direct,而其他設備只需要支持傳統的Wifi就可以了(個人覺得其實這種使用模式很像Android的便攜熱點功能)。

7.連接信息獲取要監聽連接狀態的變更,需要實現 WifiP2pManager.ConnectionInfoListener 接口,回調函數 onConnectionInfoAvailable將會在連接狀態改變時通知。
回到廣播接收器的onReceive方法中,修改監聽WIFI_P2P_CONNECTION_CHANGED_ACTION的部分。收到該意圖(Intent)時,調用 requestConnectionInfo。這是一個異步的調用,所以結果會傳給作為參數的連接信息監聽器。
8.斷連
removeGroup是移除群組,斷連所有設備。
cancelConnect是取消連接狀態為Invited的設備
一些問題:
如何獲得WifiP2pGroupInfo,它有什么用?
