开发背景: root过的设备  4.4版本

需求: 可由后台配置好wifi账号和密码 推送到设备,设备如果搜索到此wifi账号则自动连接.


1:需先找到android设备将wifi信息保存到哪里去了?


还是很好找的在这里:misc/wifi/wpa_supplicant.conf

可以看下里面都存的是什么:

android wifi保活 android wifi密码保存位置_wi-fi

如图 是我获取到的文件信息

上面是一些硬件信息,可以不用管,下面的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设备需要一定的时间 比较慢