Android6.0系统获取wifi密码列表,并导入到另一台设备中

客户有个需求是,要把一台手机连接的wifi信息,以及其他配置信息一同导入到另一台手机中,然后生效。其他系统配置信息例如系统密码,usb调试等,比较容易做到。但wifi列表的话,是保存在/data/misc/wifi/wpa_supplicant.conf文件中。用cat命令查看,可以看到network={...}的信息,就是系统保存的wifi账号密码,可以保存所有连接过的wifi信息


Android6.0系统获取wifi密码列表,并导入到另一台设备中_第1张图片
image.png

但是很遗憾的是,这个wpa_supplicant.conf文件是归属于wifi所有的,所以我们不能通过读写和拷贝这个文件


Android6.0系统获取wifi密码列表,并导入到另一台设备中_第2张图片
image.png

原想在上层Settings工程中,通过追踪系统源码,查看在设置-wifi里是如何保存系统wifi的,但是发现要在Settings获取WifiConfiguration对象的preSharedKey,即wifi密码时返回的是*,而且保存wifi的配置也很麻烦。所以就在frameworks中搜索
/data/misc/wifi/wpa_supplicant.conf,在frameworks/opt\net\wifi\service\java\com\android\server\wifi\WifiConfigStore中找到了读取这个文件的代码。


Android6.0系统获取wifi密码列表,并导入到另一台设备中_第3张图片
image.png

Android6.0系统获取wifi密码列表,并导入到另一台设备中_第4张图片
image.png

这说明了在WifiConfigStore中有权限可以读取这个文件,那么我们在其他系统应用中可以发广播,在这里读取文件,通过广播把读取到的wifi配置信息回传回去。

在frameworks/opt\net\wifi\service\java\com\android\server\wifi\WifiStateMachine中有WifiConfigStore的实例,而且这个文件中有注册监听广播的地方,我们可以直接copy,注册自己的广播


Android6.0系统获取wifi密码列表,并导入到另一台设备中_第5张图片
image.png
Android6.0系统获取wifi密码列表,并导入到另一台设备中_第6张图片
image.png

这样我们就拿到了wifi的账号密码的所有列表。然后就是导入另一台设备中了。


Android6.0系统获取wifi密码列表,并导入到另一台设备中_第7张图片
image.png
Android6.0系统获取wifi密码列表,并导入到另一台设备中_第8张图片
image.png

在WifiConfigStore没看到写wpa_supplicant.conf这个文件的操作,而且这个文件除了network以外还有设备自身的其他信息,所以选择是截取除network外的其他信息,与通过广播传进来的需要导入的network信息拼接在一起,删除wpa_supplicant.conf文件,重新将这些信息写入新的wpa_supplicant.conf文件。通过cat命令看的确剩下了,但重启之后发现wifi打不开了,原因是因为我们通过代码写的wpa_supplicant.conf文件,文件归属于System,而不在属于wifi,所以读取不了这个文件,wifi就打不开了。

所以要修改这个文件的权限,重启的时候让他变为wifi所有的文件。
修改 \MTK6755\system\core\rootdir\init.rc


Android6.0系统获取wifi密码列表,并导入到另一台设备中_第9张图片
image.png

修改 \MTK6755\device\mediatek\mt6755\meta_init.rc

Android6.0系统获取wifi密码列表,并导入到另一台设备中_第10张图片
image.png

这样重启的时候就会重新将wpa_supplicant.conf文件修改为wifi所有,效果也实现了

你可能感兴趣的:(Android6.0系统获取wifi密码列表,并导入到另一台设备中)