1. 程式人生 > >Android對其他應用/data分割槽下檔案的讀取

Android對其他應用/data分割槽下檔案的讀取

最近在做一個功能,需要判斷一個第三方應用/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})

便可以獲取到目標目錄下所有檔案的列表。