安卓系统在连接wifi的时候会保存连接的密码,这一配置信息保存在/data/misc/wifi/wpa_supplicant.conf目录下。
但是这个目录需要Root权限才能读取,但是有个问题是很多root了用户打开data目录的时候是空的,用rootexplore打开也是空的
我手中的一个百度小鸟平板用的4.2.2的系统就存在这个问题。
用adb shell命令打开平板目录尝试
shell@viewsonic82_6122:/ $ ls /data ls /data opendir failed, Permission denied可以看到/data目录下的ls 命令被禁用了
看下面这个命令
shell@viewsonic82_6122:/ $ cd /data cd /data shell@viewsonic82_6122:/data $ cd misc cd misc shell@viewsonic82_6122:/data/misc $ cd wifi cd wifi /system/bin/sh: cd: /data/misc/wifi: Permission denied可以看到cd命令的前两层命令正常,再往后面就被禁止使用cd命令了。
这个目录其实是存在的,我们可以通过root把目录权限改掉,让它暂时能访问。
下面是代码,其中获得目录root权限的代码是直接拿过来用的,在此表示感谢。
1.Activity的代码
package com.example.readwificfg; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.List; import android.app.Activity; import android.content.Context; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.example.readwificfg.service.getRoot; public class MainActivity extends Activity { private TextView tv_result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_result = (TextView) findViewById(R.id.tv_result); //获得前两个路径的ROOT权限 String path="/data/misc/wifi"; getRoot.upgradeRootPermission(path); path="/data/misc/wifi/wpa_supplicant.conf"; getRoot.upgradeRootPermission(path); } public void readwificfg(View view){ try { //逐行读取wpa_supplicant.conf里的文本内容,存到字符串result中 File file = new File( "/data/misc/wifi/wpa_supplicant.conf"); FileInputStream fls=new FileInputStream(file); BufferedReader br=new BufferedReader(new InputStreamReader(fls)); String line=null; StringBuilder result=new StringBuilder(); while((line=br.readLine())!=null){ result.append(line); result.append("\n"); } br.close(); //把读出来的字符串显示到长文本框中 tv_result.setText(result.toString()); Toast.makeText(this, "读取wifi配置文件成功",Toast.LENGTH_SHORT).show(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(this, "读取wifi配置文件失败,请确保取得ROOT权限", Toast.LENGTH_SHORT).show(); } } public void readwificfg2(View view){ try { //创建WifiManager实例 WifiManager wfm=(WifiManager) this.getSystemService(Context.WIFI_SERVICE); //获得配置信息的List List<WifiConfiguration> configs=wfm.getConfiguredNetworks(); StringBuilder result=new StringBuilder(); String head="SSID"+"\t"+"密码"+"\n"; result.append(head); //读每一个配置信息,并加到字符串 for(WifiConfiguration config:configs){ String str = config.SSID+"\t"+config.preSharedKey+"\n"; result.append(str); } tv_result.setText(result.toString()); String size=String.valueOf(configs.size()); Toast.makeText(this, "读取wifi配置,节点数目"+size, Toast.LENGTH_SHORT).show(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(this, "读取wifi配置失败", Toast.LENGTH_SHORT).show(); } } }
package com.example.readwificfg.service; import java.io.DataOutputStream; public class getRoot { /** * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限) * * @return 应用程序是/否获取Root权限 */ public static boolean upgradeRootPermission(String pkgCodePath) { Process process = null; DataOutputStream os = null; try { String cmd="chmod 777 " + pkgCodePath; process = Runtime.getRuntime().exec("su"); //切换到root帐号 os = new DataOutputStream(process.getOutputStream()); os.writeBytes(cmd + "\n"); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) { return false; } finally { try { if (os != null) { os.close(); } process.destroy(); } catch (Exception e) { } } return true; } }3.布局文件
<LinearLayout xmlns:android="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:orientation="vertical" tools:context="${relativePackage}.${activityClass}" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="readwificfg" android:text="从固定路径读取wifi配置文件" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="readwificfg2" android:text="从API读取wifi配置,密码为*不可读" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/tv_result" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </ScrollView> </LinearLayout>
第二个按钮的代码使用API,但是拿到的密码是一个星号,API存的时候是把字符串存进去了,但是返回的时候返回*,第二个按钮的代码在我的2.2.2的系统上运行正常,4.2.2的系统读取失败