2015-08-22 171 views
-1

我使用RootTools庫從hereRootTools.deleteFileOrDirectory始終返回false

授予root權限的應用程序後,我試圖刪除根使用內部存儲的文件。

deleteStatus = RootTools.deleteFileOrDirectory(file.getAbsolutePath(), true); 

deleteStatus總是原來是錯誤的,該文件也不會被刪除。

我在這裏做錯了什麼?

UPDATE

我是新與ROOT使用。我在ROOT的應用程序中基本上有很少的要求。

1)我需要檢查設備上是否有ROOT。 (RootTools.isRootAvailable())

2)I需要給一個ROOT權限提示用戶授予超級用戶權限(RootTools.isAccessGiven())

3)刪除文件和文件夾(RootTools.deleteFileOrDirectory)

除刪除方法外,一切都很完美。我如何使用libsuperuser來做到這一點?

+0

您可以將路徑粘貼到文件嗎? –

+0

是的,路徑是/storage/emulated/0/logo_large_new.png –

回答

1

RootTools不是最大的。就我個人而言,我建議使用libsuperuser

有很多原因爲什麼你的文件沒有被刪除。如果您查看RootTools,則不會在路徑中添加引號。所以,如果你的文件包含空格,那麼它不會被刪除。

RootTools

​​

它應該是:

Command command = new Command(0, false, "rm -r \"" + target + "\""); 
Shell.startRootShell().add(command); 
commandWait(Shell.startRootShell(), command); 

編輯:

通過Environment.getExternalStorageDir()返回的路徑不能在shell讀取。在將命令發送到shell之前,您需要更改路徑。

爲了解決這個問題您可以在下面的靜態工廠方法添加到您的項目:

/** 
* The external storage path is not readable by shell or root. This replaces {@link 
* Environment#getExternalStorageDirectory()} with the environment variable "EXTERNAL_STORAGE". 
* 
* @param file 
*   The file to check. 
* @return The original file (if it does not start with {@link 
* Environment#getExternalStorageDirectory()} 
* or a file with the correct path. 
*/ 
@SuppressLint("SdCardPath") 
public static File getFileForShell(File file) { 
    String externalStorage = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    if (!file.getAbsolutePath().startsWith(externalStorage)) { 
     return file; 
    } 
    String legacyStorage = System.getenv("EXTERNAL_STORAGE"); 
    String path; 
    if (legacyStorage != null) { 
     path = file.getAbsolutePath().replaceFirst(externalStorage, legacyStorage); 
    } else { 
     path = file.getAbsolutePath().replaceFirst(externalStorage, "/sdcard"); 
    } 
    return new File(path); 
} 

然後,當你調用RootTools.deleteFileOrDirectory(String target, boolean remountAsRw);更改文件路徑:

String path = getFileForShell(file).getAbsolutePath(); 
RootTools.deleteFileOrDirectory(path, true); 

你不」 t需要root訪問權限才能刪除內部存儲上的文件。您需要清單中聲明的​​許可android.permission.WRITE_EXTERNAL_STORAGE


libsuperuser

要檢查是否root訪問權限信息,並將顯示root權限提示,你可以調用下面的方法:

boolean isRooted = Shell.SU.available(); 

圖書館,libsuperuser,無意做RootTools嘗試做的所有事情。如果您選擇使用libsuperuser,則需要將命令發送到shell。

刪除與libsuperuser文件的一個例子:

void delete(File file) { 
    String command; 
    if (file.isDirectory()) { 
     command = "rm -r \"" + file.getAbsolutePath() + "\""; 
    } else { 
     command = "rm \"" + file.getAbsolutePath() + "\""; 
    } 
    Shell.SU.run(command); 
} 

請注意,這並不掛載文件系統的讀/寫或者檢查是否rm可在設備上(東西RootTools不會當你調用deleteFileOrDirectory) 。


這是一個冗長的答案。如果您還有其他問題,我會建議閱讀任一圖書館項目的文檔。

+0

感謝您的答案。實際上,如果我現在需要遷移圖書館,那麼我需要做出很多改變。而libsuperuser對我來說似乎有點困難。如何修改RootTools中的刪除方法,使其完美工作。 –

+0

你可以在GitHub上打開一個問題。我更新了我的答案。我的答案應該工作,因爲你的文件不包含空格。 –

+0

其實,我正在測試內部存儲。但用戶也可以在外部SD卡上擁有文件,也可以使用空格的文件名。這種新方法能解決這兩個問題嗎? –