2014-03-01 80 views
0

我需要訪問包含在另一個應用的私有文件夾中的文件。我已經授予我的應用程序root權限並更改了權限 - 雖然我認爲這不是必需的 - 但是當我嘗試從文件讀取時,我得到「權限被拒絕」。在根設備中讀取私有文件(/ data/data文件夾)

這是代碼:

File file = new File("/data/data/other.app/shared_prefs/file.xml"); 
if(file.exists()) { 

    try { 
     Runtime.getRuntime().exec("su"); 
     Runtime.getRuntime().exec("chmod 777 " + file.getAbsolutePath()); 
     InputStream in = new FileInputStream(file); 

     .... 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

不應該是一個空間,在這裏** 「文件名」前的「chmod 777」**? –

+0

感謝您指出。我編輯了代碼,但仍然無法打開文件 –

回答

1

也許你不會是能夠做到這一點,因爲Android上的每個應用程序都有獨特的權限的用戶。

看到這個:http://developer.android.com/guide/topics/security/permissions.html#userid

由應用程序存儲的任何數據都將被賦予一個應用程序的用戶ID,並不能正常訪問其他包。使用getSharedPreferences(String,int),openFileOutput(String,int)或openOrCreateDatabase(String,int,SQLiteDatabase.CursorFactory)創建新文件時,可以使用MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE標誌以允許任何其他軟件包讀取/寫入文件。設置這些標誌時,文件仍然歸您的應用程序所有,但其全局讀取和/或寫入權限已被適當設置,因此任何其他應用程序都可以看到它。

+1

Mmh我不同意。有「根瀏覽器」誰可以瀏覽和打開文件到處(也是我試圖打開的文件),所以這是可行的 –

+1

這個答案對於「Android」是正確的,但不適用於被黑客入侵的構建,這些構建有某種'su'根墊片。 –

1

你不能分解su和chmod操作。 (「su」);

此代碼: Runtime.getRuntime()。exec(「su」); Runtime.getRuntime()。exec(「chmod 777」+ file.getAbsolutePath());

不會導致在根shell中執行chmod。每次調用exec都會啓動一個新進程。

您需要在單個進程中運行您需要的所有命令。最簡單的方法是將shell腳本寫入/ data/data目錄,爲您執行這些操作,然後通過sh shell處理器運行它。

請注意,良好的安全措施是將您的應用程序中的文件修改爲世界上不可讀的文件,以便您不會讓其他應用程序永遠暴露。

這個答案看起來有你需要的東西:Run binary from with root Android Application

+0

謝謝你的幫助。所以調用exec(String [])應該可以工作,而不是調用exec(String)兩次? –

+0

不,你不理解。無論參數的數量如何,exec()都會創建一個進程。參數被視爲具有多個參數的單個命令行。你需要用一個命令完成你想要做的事情。找到一個命令行命令,使用adb shell執行所需的操作。 例如,exec(「/ system/bin/sh」,「-c」,「su && chmod 777」+ file.getAbsolutePath())可能會做你想做的。 –

+0

是的,現在我明白了這個問題,看到我的回答如下 –

0

使用此代碼來運行命令解決


解決:

public static void runAsRoot(String[] cmds){ 
    try { 
     Process p = Runtime.getRuntime().exec("su"); 
     DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
     for (String tmpCmd : cmds) { 
      os.writeBytes(tmpCmd+"\n"); 
     } 
     os.writeBytes("exit\nexit\n"); 
     os.flush(); 
     p.waitFor(); 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } catch(InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
相關問題