6.4.1 Settings中的WSC处理
最后更新于:2022-04-02 06:04:28
本节内容从Settings开始,当选择图6-2左图所示的“WPS PIN条目”后,将弹出图6-2右图所
示的WPS设置对话框。该对话框对应的类是WpsDialog中,其代码如下所示。
**WpsDialog.java::WpsDialog**
~~~
public WpsDialog(Context context, int wpsSetup) {
super(context);
mContext = context;
mWpsSetup = wpsSetup;
// PIN和PBC方法都在这个WpsDialog中实现
class WpsListener implements WifiManager.WpsListener {
public void onStartSuccess(String pin) {
if (pin != null) {
// WSC PIN启动成功,WPAS将动态创建一个PIN码,此处由WpsDialg显示出来
updateDialog(DialogState.WPS_START, String.format(mContext.getString(R.string.wifi_wps_onstart_pin), pin));
} else {// PBC处理
updateDialog(DialogState.WPS_START, mContext.getString(R.string.wifi_wps_onstart_pbc));
}
}
public void onCompletion() {
updateDialog(DialogState.WPS_COMPLETE,
mContext.getString(R.string.wifi_wps_complete));
}
public void onFailure(int reason) {
......
}
mWpsListener = new WpsListener();// 监听WPS操作的结果
mFilter = new IntentFilter();
// 监听NETWORK_STATE_CHANGED_ACTION广播
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
handleEvent(context, intent);// handleEvent的代码比较简单,读者不妨自行阅读。
}
};
}
}
~~~
我们跳过WpsDialog的onCreate函数直接进入其onStart函数,在该函数中,WpsDialog将借助WifiManager和WifiStateMachine交互,相关代码如下所示。
**WpsDialog.java::onStart**
~~~
protected void onStart() {
mTimer = new Timer(false);
mTimer.schedule(new TimerTask() {
......// 更新进度条
} , 1000, 1000);
mContext.registerReceiver(mReceiver, mFilter);
WpsInfo wpsConfig = new WpsInfo();// 构造一个WpsInfo对象
wpsConfig.setup = mWpsSetup;// 对PIN来说,mWpsSetup的值为WpsInfo.DISPLAY
// 调用WifiManager的startWps函数,该函数内部将向WifiStateMachine发送START_WPS消息
mWifiManager.startWps(wpsConfig, mWpsListener);
}
~~~
当手机通过WPS成功加入无线网络后,NETWORK_STATE_CHANGED_ACTION广播将在handleEvent中被处理。这部分代码非常简单,请读者自行阅读。
根据代码中的注释可知,startWps将向WifiStateMachine发送START_WPS消息。WifiStateMachine该如何处理它呢?
';