开发背景: root过的设备 4.4版本
需求: 可由后台配置好wifi账号和密码 推送到设备,设备如果搜索到此wifi账号则自动连接.
1:需先找到android设备将wifi信息保存到哪里去了?
还是很好找的在这里:misc/wifi/wpa_supplicant.conf
可以看下里面都存的是什么:
如图 是我获取到的文件信息
上面是一些硬件信息,可以不用管,下面的network是我们要处理的信息
ssid存的就是wifi账号,psk就是密码,key_mgmt是加密类型,对我们也没什么用,priority是优先级
我们重点关注ssid和psk
也就是说我们只需要将network信息写到这个文件里就行了
2:怎么写?
虽然设备已经root过,但是读写的权限还是只有系统才能写,需要改变这个文件的权限让root权限也可以对该文件读写.
这里可以了解一下文件的权限知识:
每个文件都有 读写运行权限,一个文件的权限用 r (读)w(写) x(运行)表示,r=2,w=4,x=1, 也就是说 要有所有的权限就需要7
一个文件权限一般是这样表示的:rwxrwxrwx 第一个rwx指的是登陆用户,第二个是他所在的组,第三个是其他用户,加入其他用户对该文件没有任何权限就是:rwxrwx---(770);他所在的组只有读的权限:rwxr-----(720),
针对于我们的需求 我们就简单粗暴的改为777的权限就ok了.
3:改权限
直接使用 adb命令:
先修改文件夹权限:"chmod 777 /data/misc/wifi"
再修改文件权限:"chmod 777 data/misc/wifi/wpa_supplicant.conf"
这里说一下为什么要分两步: 做的时候 我也刚开始只是修改了文件权限,但是都不成功,后来查看了下权限,发现是对文件夹没有读写的权限,那就把文件夹的权限也修改了就OK了!!哈哈
在静默安装那篇文章里就发过一个执行adb命令的工具类,这里再发一下:执行adb命令工具类
4:直接写:
把服务器推过来的账号密码按格式写进文件就行啦
String data= "\n" + "\n" + "network={\n" + "\tssid=\""+ssid+"\"\n" + "\tpsk=\""+pwd+"\"\n" + "\tscan_ssid=1\n" + "\tkey_mgmt=WPA-PSK\n" + "\tpriority=3\n" + "}";
5:写进来之后可以去尝试连接一次,重启wifi直接尝试连接
private void restartWifi(){ if(mWifiManager.isWifiEnabled()){ mWifiManager.setWifiEnabled(false); } mWifiManager.setWifiEnabled(true); isRestartWifi=true; ULogUtil.getInstance().e("restartWifi"); }
重启之后直接去已经配置好的信息里连接刚才我们保存的ssid
private void enableWifi() { for (int i = 0; i < mConfigList.size(); i++) { //先去已经配置好的网络信息中查看 如果有直接连接 configuration = mConfigList.get(i); if (configuration.SSID.equals("\"" + ssid + "\"")) { mWifiManager.enableNetwork(configuration.networkId, true); mTimerTask=new ConnectWifiTask(); mTimer=TimerManager.schedule(mTimerTask,10*1000); return; } } }
mConfigList 是获取到的所有的文件里保存的network
mConfigList=mWifiManager.getConfiguredNetworks();
这个后面也做了别的优化:
10秒之后去查看是否连上了我们配置的ssid,如果没连上就再重启wifi让设备自己随便连哪个wifi都可以
写10秒的延迟是因为重启再连上一次wifi设备需要一定的时间 比较慢