WifiP2pSettings工作流程
来源:互联网 发布:网络招生技巧 编辑:程序博客网 时间:2024/06/08 07:02
Android平台中,P2P操作用户只需执行如下三个步骤:
1)进入WifiP2pSettings界面;
2)搜索周围的P2P设备。搜索到的设备将显示在WifiP2pSettings中。
3)用户选择其中的某个设备以发起连接。
首先来看WifiP2pSettings的onActivityCreate函数。
1.WifiP2pSettings创建
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
用户下一步要做的事情就是主动搜索周围的P2P设备。Android原生代码中的WifiP2pSettings界面下方有两个按钮,分别是SEARCH和RENAME,分别用于搜索周围的P2P Device和更改本机的P2P设备名。
当P2P功能正常启用后(即上述代码中的mWifiP2pEnabled为true时),这两个按钮将被使能。此后,用户就可单击SEARCH按钮以搜索周围的P2P设备。该按钮对应的函数是startSearch。
当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:
在该函数中,WifiP2pDeviceList中保存的每一个WifiP2pDevice信息将作为一个Preference项添加到mPeersGroup中并显示在UI界面上。
接下来用户就可在界面中选择某个P2P设备并与之连接,这个步骤由onPreferenceTreeClick函数来完成。
当系统完成和P2P设备的连接后,WifiP2pSettings将收到 WIFI_P2P_CONNECTION_CHANGED_ACTION 广播,对应的代码见onReceive
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 connection
- Log.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中按钮对应的onClickListener
- mRenameListener = new OnClickListener() {
- @Override
- public 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 listener
- mDisconnectListener = new OnClickListener() {
- @Override
- public 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 listener
- mCancelConnectListener = new OnClickListener() {
- @Override
- public 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 listener
- mDeleteGroupListener = new OnClickListener() {
- @Override
- public 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() {
- @Override
- public 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 event
- startSearch(); //如果没有加入某个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功能正常启用后(即上述代码中的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);
- }
- });
- }
- }
当系统搜索到新的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);
- }
接下来用户就可在界面中选择某个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配置方法,优先考虑PBC
- if (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
阅读全文
0 0
- WifiP2pSettings工作流程
- WifiP2pSettings工作流程
- Android4.4 WifiP2pSettings 中调用流程
- 工作流程
- 工作流程
- 工作流程
- 工作流程
- 工作流程
- struts2工作原理 工作流程
- flash工作流程设计
- jBPM工作流程定义
- 小议团队工作流程
- OpenGL工作流程
- W3C工作流程
- Struts工作流程
- jBPM工作流程定义
- Struts开发工作流程
- Struts工作流程
- 广播发送
- MyBatis+MySQL 返回插入的主键ID
- C#调用C++动态库(dll)
- unity3d各平台的路径问题
- GA遗传算法入门到掌握
- WifiP2pSettings工作流程
- java8——lambda expression
- hadoop初读--setInputFormatClass
- ExoPlayer 的小解析
- volatile 浅显描述
- Fiddler:读取Response的body写入本地文件
- GA遗传算法(Genetic Algorithm)
- TimingWheel[时间轮]介绍
- Android Web开发调试之Chrome远程调试