转载请标明出处:
http://blog.csdn.net/u011974987/article/details/50551580;
本文出自:【Xiho的博客】
网上关于如何用代码设置wifi的文章一搜一大堆,我在此就不再添乱了,我就试着给大家谈一谈我遇到的问题吧。
首先,我在做有系统定制某App的wifi模块的项目需求时候,系统默认在出厂设置的时候wifi 是关闭的,当打开连接wifi(获取wifi信息列表)的页面的时候,我要初始化把wifi打开,这个时候直接获取wifi列表,却迟迟没有数据返回,后来我又监听了
`WifiManager.SCAN_RESULTS_AVAILABLE_ACTION`,
这个广播,收到广播的时候再去获取wifi信息,果然,获取到了,可是这时候有个问题,哎妈呀,当wifi打开的时候,去调用这个
`mWifiManager.startScan();`
去扫描wifi ,等收到上面这个广播之后再去获取wifi,
mScanResults = mWifiManager.getScanResults();
但是这个期间却要等待12左右才获取到wifi的数据信息,对于一个产品,用户的体验来说,肯定是不合理的,当时,我也找了好多资料,却都没怎么说这方面的内容,苦了好久,也没想明白,因为也不甜熟悉这一块,后来就去Android 官网查看Wifi相关的API ,收获却不小,但是这个Bug还是没头绪,于是就单独写了一个小Demo 来一步一步测试,贴代码,再详细说明:
我们添加两个按钮,开启Wifi,关闭wifi:
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.xu.MainActivity" >
id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
MainActivity:
/**
* 打开wifi功能
* true:打开成功;
* false:打开失败
*/
public boolean openWifi() {
boolean bRet = true;
if (!mWifiManager.isWifiEnabled()) {
bRet = mWifiManager.setWifiEnabled(true);
}
return bRet;
}
/**
* Function:关闭wifi
* @return
*/
public boolean closeWifi() {
if (mWifiManager.isWifiEnabled()) {
return mWifiManager.setWifiEnabled(false);
}
return false;
}
当进入这个页面的时候就去注册广播,然后先去手动打开wifi,调用openWifi()方法,
/**
* 注册广播
*/
private void registerBroadcast() {
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(mReceiver, filter);
}
打印出相应的Log时间差信息:
/**
* 打开wifi
*/
openWifi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openWifi();
Log.d(TAG, "开启" + DateUtils.getCurrentDateString());
mWifiManager.startScan();
}
});
/**
* 关闭wifi
*/
closeWifi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
closeWifi();
Log.d(TAG, "关闭" + DateUtils.getCurrentDateString());
}
});
接收广播的时候也输出相应的日志信息,如果在接收到
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
这个广播的时候再去扫描wifi信息;
mWifiManager.startScan();
mScanResults = mWifiManager.getScanResults();
这个时候去看log输出的接收到这个广播的时间,代码如下:
/**
* 广播接收,监听网络
*/
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
// wifi已成功扫描到可用wifi。
if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
Log.d(TAG, "接收到" +DateUtils.getCurrentDateString());
mWifiManager.startScan();
mScanResults = mWifiManager.getScanResults();
Log.d(TAG, "mScanResults.size()===" + mScanResults.size());
}
}
};
这个时候我就监听了这一个广播,log日志看图:
看上面的时间差就等候了近13秒左右才出来结果,就是为了解决这个问题,又去看有关的资料和API,后来有添加一个广播。
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
更改后,在监听这个系统wifi打开时候,就去扫描wifi,
/**
* 广播接收,监听网络
*/
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
// wifi已成功扫描到可用wifi。
if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
Log.d(TAG, "接收到" +DateUtils.getCurrentDateString());
mScanResults = mWifiManager.getScanResults();
Log.d(TAG, "mScanResults.size()===" + mScanResults.size());
}
//系统wifi的状态
else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
int wifiState = intent.getIntExtra(
WifiManager.EXTRA_WIFI_STATE, 0);
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
Log.d(TAG, "WiFi已启用" + DateUtils.getCurrentTime());
mWifiManager.startScan(); <<<这里
break;
case WifiManager.WIFI_STATE_DISABLED:
Log.d(TAG, "Wifi已关闭" + DateUtils.getCurrentTime());
break;
}
}
}
};
运行后看下log日志:
demo会放在后面附件里
惊奇的发现,哇哦!这个速度到wifi数据显示的时间差就在2秒左右哦,非常棒!这个就是我们想要的效果~,当然了,其实还要更多的方法同样能实现这样的效果,本人能力有限,还是自己不够用心,基础不扎实,不够努力,导致了这样,那样的问题。在别人眼里,虽然没什么难度,但是终究自己弄了个小demo 测试了出来,就把遇到问题就分享给了大家,以后慢慢学会写博客~
等这段时间忙完了,我正整理一下连接wifi的相关操作的完整demo,到时候再更新博客~
Demo下载:Android 打开wifi快速获取Wifi信息Demo