今天下午看到一篇博文,通过adb查看手机里面的一个文件,可以查看自己手机连接的一些wifi以及密码,我就想能不能把手机里面的这个文件读出来,显示在界面上,用户可以随便查看自己的一些wifi和密码,经过一下午的研究,终于可以顺利获取和展示。前提是手机必须root并且是真机。
关键代码如下:
private String getWifiInfoString() {
//把/data/misc/wifi/下面的wpa_supplicant.conf文件拷贝到/sdcard/holidayTxt.txt路径
String cmdString1 = "cp /data/misc/wifi/wpa_supplicant.conf /sdcard/holidayTxt.txt" + "\n";
//执行这条命令
RootCmd.getInstance().execRootCmd(cmdString1);
//降低holiday.txt文件的权限
String cmdString2 = "chmod 777 /sdcard/holidayTxt.txt" + "\n";
//执行这条命令
RootCmd.getInstance().execRootCmd(cmdString2);
String finalString = "";
StringBuffer buffer = new StringBuffer();
try {
FileInputStream fis = new FileInputStream("/sdcard/holidayTxt.txt");
InputStreamReader isr = new InputStreamReader(fis, "GB2312");//文件编码Unicode,UTF-8,ASCII,GB2312,Big5
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char) ch);
}
in.close();
String s = buffer.toString();
int netWorksIndex = s.indexOf("network");
finalString = s.substring(netWorksIndex);
// String[] sList = netWorks.split("}");
Log.d("holiday", finalString);
} catch (IOException e) {
Log.d("holiday", e.getMessage());
}
return finalString;
}
原理:/data/misc/wifi/wpa_supplicant.conf下面存放了这个手机的wifi信息,必须root了才能读取,我把这个文件拷贝到sd卡/sdcard/holiday.txt这个文件里面,然后通过读取holiday.txt这个文件,显示在界面上。RootCmd是封装好的一个类,可以执行相应的命令,相当于在cmd中执行命令行。
package com.RootCmd;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import android.util.Log;
public final class RootCmd {
private static final String TAG = "RootCmd";
private static boolean mHaveRoot = false;
private static RootCmd sInstance = null;
public static RootCmd getInstance() {
synchronized (RootCmd.class) {
if (sInstance == null) {
sInstance = new RootCmd();
}
}
return sInstance;
}
public static boolean haveRoot() {
if (!mHaveRoot) {
int ret = execRootCmdSilent("echo test");
if (ret != -1) {
Log.i(TAG, "have root!");
mHaveRoot = true;
} else {
Log.i(TAG, "not root!");
}
} else {
Log.i(TAG, "mHaveRoot = true, have root!");
}
return mHaveRoot;
}
public static String execRootCmd(String cmd) {
String result = "";
DataOutputStream dos = null;
DataInputStream dis = null;
try {
Process p = Runtime.getRuntime().exec("su");
dos = new DataOutputStream(p.getOutputStream());
dis = new DataInputStream(p.getInputStream());
Log.i(TAG, cmd);
dos.writeBytes(cmd + "\n");
dos.flush();
dos.writeBytes("exit\n");
dos.flush();
String line = null;
while ((line = dis.readLine()) != null) {
Log.d("result", line);
result += line;
}
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
public static int execRootCmdSilent(String cmd) {
int result = -1;
DataOutputStream dos = null;
try {
Process p = Runtime.getRuntime().exec("su");
dos = new DataOutputStream(p.getOutputStream());
Log.i(TAG, cmd);
dos.writeBytes(cmd + "\n");
dos.flush();
dos.writeBytes("exit\n");
dos.flush();
p.waitFor();
result = p.exitValue();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
}
手机必须root,否则无效。
如有问题可以发邮件到 friday_holiday@163.com进行讨论