日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

WifiP2pSettings工作流程

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WifiP2pSettings工作流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文為《深入理解Android Wi-Fi、NFC和GPS卷》讀書筆記,Android源碼為Android 5.1

Android平臺中,P2P操作用戶只需執行如下三個步驟:
1)進入WifiP2pSettings界面;
2)搜索周圍的P2P設備。搜索到的設備將顯示在WifiP2pSettings中。
3)用戶選擇其中的某個設備以發起連接。
首先來看WifiP2pSettings的onActivityCreate函數。
1.WifiP2pSettings創建

android-5.1/packages/apps/Settings/src/com/android/settings/wifi/p2p/WifiP2pSettings.java

    public void onActivityCreated(Bundle savedInstanceState) {addPreferencesFromResource(R.xml.wifi_p2p_settings);//加載界面元素/*WifiP2pSettings也是通過監聽廣播的方式來了解系統中Wi-Fi P2P相關的信息及變化情況。下面這幾個廣播屬于P2P特有的,其作用如下:WIFI_P2P_STATE_CHANGED_ACTION:用于通知系統中P2P功能的啟用情況,如該功能是enable還是disable。WIFI_P2P_PEERS_CHANGED_ACTION:系統內部將保存搜索到的其他P2P設備信息,如果這些信息有變化,則系統將發送該廣播。接收者需要通過WifiP2PManager的requestPeers函數重新獲取這些P2P設備的信息。WIFI_P2P_CONNECTION_CHANGED_ACTION:用于通知P2P連接情況,該廣播可攜帶WifiP2pInfo和NetworkInfo兩個對象。相關信息可從這兩個對象中獲取。WIFI_P2P_THIS_DEVICE_CHANGED_ACTION:用于通知本機P2P設備信息發生了變化。WIFI_P2P_DISCOVERY_CHANGED_ACTION:用于通知P2P Device Discovery的工作狀態,如啟動或停止。WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION:用于通知persistent group信息發生了變化。mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION);mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION);final Activity activity = getActivity();//創建WifiP2pManager對象,它將和WifiP2pService交互mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);if (mWifiP2pManager != null) {//初始化WifiManager并建立和WiFiService的聯系mChannel = mWifiP2pManager.initialize(activity, getActivity().getMainLooper(), null);if (mChannel == null) {//Failure to set up connectionLog.e(TAG, "Failed to set up connection with wifi p2p service");mWifiP2pManager = null;}} else {Log.e(TAG, "mWifiP2pManager is null !");}if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_DIALOG_PEER)) {WifiP2pDevice device = savedInstanceState.getParcelable(SAVE_DIALOG_PEER);mSelectedWifiPeer = new WifiP2pPeer(getActivity(), device);}if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_DEVICE_NAME)) {mSavedDeviceName = savedInstanceState.getString(SAVE_DEVICE_NAME);}if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_SELECTED_GROUP)) {mSelectedGroupName = savedInstanceState.getString(SAVE_SELECTED_GROUP);}//創建UI中按鈕對應的onClickListenermRenameListener = new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (which == DialogInterface.BUTTON_POSITIVE) {if (mWifiP2pManager != null) {mWifiP2pManager.setDeviceName(mChannel,mDeviceNameText.getText().toString(),new WifiP2pManager.ActionListener() {public void onSuccess() {if (DBG) Log.d(TAG, " device rename success");}public void onFailure(int reason) {Toast.makeText(getActivity(),R.string.wifi_p2p_failed_rename_message,Toast.LENGTH_LONG).show();}});}}}};//disconnect dialog listenermDisconnectListener = new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (which == DialogInterface.BUTTON_POSITIVE) {if (mWifiP2pManager != null) {mWifiP2pManager.removeGroup(mChannel, new WifiP2pManager.ActionListener() {public void onSuccess() {if (DBG) Log.d(TAG, " remove group success");}public void onFailure(int reason) {if (DBG) Log.d(TAG, " remove group fail " + reason);}});}}}};//cancel connect dialog listenermCancelConnectListener = new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (which == DialogInterface.BUTTON_POSITIVE) {if (mWifiP2pManager != null) {mWifiP2pManager.cancelConnect(mChannel,new WifiP2pManager.ActionListener() {public void onSuccess() {if (DBG) Log.d(TAG, " cancel connect success");}public void onFailure(int reason) {if (DBG) Log.d(TAG, " cancel connect fail " + reason);}});}}}};//delete persistent group dialog listenermDeleteGroupListener = new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (which == DialogInterface.BUTTON_POSITIVE) {if (mWifiP2pManager != null) {if (mSelectedGroup != null) {if (DBG) Log.d(TAG, " deleting group " + mSelectedGroup.getGroupName());mWifiP2pManager.deletePersistentGroup(mChannel,mSelectedGroup.getNetworkId(),new WifiP2pManager.ActionListener() {public void onSuccess() {if (DBG) Log.d(TAG, " delete group success");}public void onFailure(int reason) {if (DBG) Log.d(TAG, " delete group fail " + reason);}});mSelectedGroup = null;} else {if (DBG) Log.w(TAG, " No selected group to delete!" );}}} else if (which == DialogInterface.BUTTON_NEGATIVE) {if (DBG) {Log.d(TAG, " forgetting selected group " + mSelectedGroup.getGroupName());}mSelectedGroup = null;}}};setHasOptionsMenu(true);final PreferenceScreen preferenceScreen = getPreferenceScreen();preferenceScreen.removeAll();preferenceScreen.setOrderingAsAdded(true);mThisDevicePref = new Preference(getActivity());mThisDevicePref.setPersistent(false);mThisDevicePref.setSelectable(false);preferenceScreen.addPreference(mThisDevicePref);mPeersGroup = new PreferenceCategory(getActivity());mPeersGroup.setTitle(R.string.wifi_p2p_peer_devices);preferenceScreen.addPreference(mPeersGroup);mPersistentGroup = new PreferenceCategory(getActivity());mPersistentGroup.setTitle(R.string.wifi_p2p_remembered_groups);preferenceScreen.addPreference(mPersistentGroup);super.onActivityCreated(savedInstanceState);}

2.WifiP2pSettings工作流程
1)WIFI_P2P_STATE_CHANGED_ACTION處理流程
打開WifiP2pSettings后,首先要等待 WIFI_P2P_STATE_CHANGED_ACTION廣播以判斷P2P功能是否正常啟動。相應的處理函數如下所示:
android-5.1/packages/apps/Settings/src/com/android/settings/wifi/p2p/WifiP2pSettings.java

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {//從 WIFI_P2P_STATE_CHANGED_ACTION廣播中獲取相關狀態信息以判斷P2P功能是否打開mWifiP2pEnabled = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,WifiP2pManager.WIFI_P2P_STATE_DISABLED) == WifiP2pManager.WIFI_P2P_STATE_ENABLED;handleP2pStateChanged();//如果搜索到新的P2P設備,則WIFI_P2P_PEERS_CHANGED_ACTION將被發送} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {mPeers = (WifiP2pDeviceList) intent.getParcelableExtra(WifiP2pManager.EXTRA_P2P_DEVICE_LIST);handlePeersChanged();} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {if (mWifiP2pManager == null) return;NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);WifiP2pInfo wifip2pinfo = (WifiP2pInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO);if (networkInfo.isConnected()) {if (DBG) Log.d(TAG, "Connected");} else if (mLastGroupFormed != true) {//start a search when we are disconnected//but not on group removed broadcast eventstartSearch();	//如果沒有加入某個P2P組,則重新發起設備掃描}mLastGroupFormed = wifip2pinfo.groupFormed;} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {mThisDevice = (WifiP2pDevice) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);if (DBG) Log.d(TAG, "Update device info: " + mThisDevice);updateDevicePref();} else if (WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION.equals(action)) {int discoveryState = intent.getIntExtra(WifiP2pManager.EXTRA_DISCOVERY_STATE,WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED);if (DBG) Log.d(TAG, "Discovery state changed: " + discoveryState);if (discoveryState == WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED) {updateSearchMenu(true);//更新SEARCH按鈕顯示的名稱} else {updateSearchMenu(false);}} else if (WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION.equals(action)) {if (mWifiP2pManager != null) {mWifiP2pManager.requestPersistentGroupInfo(mChannel, WifiP2pSettings.this);}}}};

    private void handleP2pStateChanged() {updateSearchMenu(false);//該函數將觸發WifiP2pSettings的onCreateOptionsMenu被調用mThisDevicePref.setEnabled(mWifiP2pEnabled);mPeersGroup.setEnabled(mWifiP2pEnabled);mPersistentGroup.setEnabled(mWifiP2pEnabled);}
用戶下一步要做的事情就是主動搜索周圍的P2P設備。Android原生代碼中的WifiP2pSettings界面下方有兩個按鈕,分別是SEARCH和RENAME,分別用于搜索周圍的P2P Device和更改本機的P2P設備名。
當P2P功能正常啟用后(即上述代碼中的mWifiP2pEnabled為true時),這兩個按鈕將被使能。此后,用戶就可單擊SEARCH按鈕以搜索周圍的P2P設備。該按鈕對應的函數是startSearch。
    private void startSearch() {if (mWifiP2pManager != null && !mWifiP2pSearching) {//discoverPeers將搜索周圍的P2P設備mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {public void onSuccess() {}public void onFailure(int reason) {if (DBG) Log.d(TAG, " discover fail " + reason);}});}}
當WPAS完成搜索后, WIFI_P2P_PEERS_CHANGED_ACTION廣播將被發送。對該廣播的處理參考onReceive函數。startSearch還將觸發系統發送 WIFI_P2P_DISCOVERY_CHANGED_ACTION廣播,WifiP2pSettings將根據該廣播攜帶的信息來更新SEARCH按鈕的界面:如果P2P Discovery啟動成功(即狀態變為 WIFI_P2P_DISCOVERY_STARTED),則SEARCH按鈕名稱顯示為Searching,否則該按鈕顯示為Search For Devices。
當系統搜索到新的P2P設備后,WIFI_P2P_PEERS_CHANGED_ACTION廣播將被發送,而WifiP2pSettings對于該廣播的處理就是調用WifiP2pManager的requestPeers來獲取系統保存的P2P設備信息列表
系統中所有的P2P設備信息將通過PeerListener接口類的onPeersAvailable函數返回給WifiP2pSettings:

    public void onPeersAvailable(WifiP2pDeviceList peers) {if (DBG) Log.d(TAG, "Requested peers are available");//系統中所有的P2P設備信息都保存在這個類型為WifiP2pDeviceList的peers對象中mPeers = peers;handlePeersChanged();}

    private void handlePeersChanged() {mPeersGroup.removeAll();//mPeersGroup類型為PreferenceGroup,屬于UI相關的類mConnectedDevices = 0;if (DBG) Log.d(TAG, "List of available peers");for (WifiP2pDevice peer: mPeers.getDeviceList()) {if (DBG) Log.d(TAG, "-> " + peer);//WifiP2pPeer是Preference的子類,它和UI相關mPeersGroup.addPreference(new WifiP2pPeer(getActivity(), peer));if (peer.status == WifiP2pDevice.CONNECTED) mConnectedDevices++;}if (DBG) Log.d(TAG, " mConnectedDevices " + mConnectedDevices);}
在該函數中,WifiP2pDeviceList中保存的每一個WifiP2pDevice信息將作為一個Preference項添加到mPeersGroup中并顯示在UI界面上。
接下來用戶就可在界面中選擇某個P2P設備并與之連接,這個步驟由onPreferenceTreeClick函數來完成。

    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {if (preference instanceof WifiP2pPeer) {mSelectedWifiPeer = (WifiP2pPeer) preference;//獲取用戶指定的那一個WifiP2pPeer項if (mSelectedWifiPeer.device.status == WifiP2pDevice.CONNECTED) {showDialog(DIALOG_DISCONNECT);//如果已經和該設備連接,則判斷是否需要與之斷開連接} else if (mSelectedWifiPeer.device.status == WifiP2pDevice.INVITED) {showDialog(DIALOG_CANCEL_CONNECT);} else {//向對端P2P設備發起連接WifiP2pConfig config = new WifiP2pConfig();config.deviceAddress = mSelectedWifiPeer.device.deviceAddress;//判斷系統是否強制使用了某種WSC配置方法int forceWps = SystemProperties.getInt("wifidirect.wps", -1);if (forceWps != -1) {config.wps.setup = forceWps;} else {//獲取對端P2P設備支持的WSC配置方法,優先考慮PBCif (mSelectedWifiPeer.device.wpsPbcSupported()) {config.wps.setup = WpsInfo.PBC;} else if (mSelectedWifiPeer.device.wpsKeypadSupported()) {config.wps.setup = WpsInfo.KEYPAD;} else {config.wps.setup = WpsInfo.DISPLAY;}}//通過WifiP2pManager的connect函數向對端P2P設備發起連接。注意,目標設備信息保存在config對象中mWifiP2pManager.connect(mChannel, config,new WifiP2pManager.ActionListener() {public void onSuccess() {if (DBG) Log.d(TAG, " connect success");}public void onFailure(int reason) {Log.e(TAG, " connect fail " + reason);Toast.makeText(getActivity(),R.string.wifi_p2p_failed_connect_message,Toast.LENGTH_SHORT).show();}});}} else if (preference instanceof WifiP2pPersistentGroup) {mSelectedGroup = (WifiP2pPersistentGroup) preference;showDialog(DIALOG_DELETE_GROUP);}return super.onPreferenceTreeClick(screen, preference);}

當系統完成和P2P設備的連接后,WifiP2pSettings將收到 WIFI_P2P_CONNECTION_CHANGED_ACTION 廣播,對應的代碼見onReceive

總結

以上是生活随笔為你收集整理的WifiP2pSettings工作流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。