Android對其他應用/data分割槽下檔案的讀取
阿新 • • 發佈:2019-01-06
最近在做一個功能,需要判斷一個第三方應用/data分割槽下的某個檔案是否存在。未root的手機是不能訪問到其他應用/data分割槽下的檔案的,我現在使用的裝置已經打開了root。
Java的File類可以對檔案做一系列操作。開始的思路是通過File.listFiles()來獲取目標應用的子檔案列表,然後對指定的檔案進行exists()判斷。但是當進入到包名下的一個目錄時,裡面的資料夾用isDirectory()和isFile()判斷,返回的都是false,同時用canRead()做判斷,返回的也是false。判斷是檔案訪問許可權的問題,但是通過chmod 744之後,canRead()仍然返回false。看樣子通過File對/data分割槽的操作仍然受系統安全性限制。
後來找到了另外一種方法來判斷,通過執行shell命令ls -R ,獲取指定應用目錄下檔案的列表,從而判斷檔案是否存在。
這是執行shell命令的方法
public static ArrayList execCmdsforResult(String[] cmds) {
ArrayList<String> list = new ArrayList<String>();
try {
Process process = Runtime.getRuntime().exec("su");
OutputStream os = process.getOutputStream();
process.getErrorStream();
InputStream is = process.getInputStream();
int i = cmds.length;
for (int j = 0; j < i; j++) {
String str = cmds[j];
os.write((str + "\n").getBytes());
}
os.write("exit\n".getBytes());
os.flush();
os.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
while (true) {
String str = reader.readLine();
if (str == null)
break;
list.add(str);
}
reader.close();
process.waitFor();
process.destroy();
return list;
} catch (Exception localException) {
}
return list;
}
呼叫時:
ArrayList<String> list = execCmdsforResult(new String[] {"cd /data/data/com.testapp", "ls -R})
便可以獲取到目標目錄下所有檔案的列表。