RootTools.deleteFileOrDirectory始终返回false

时间:2015-08-22 04:45:57

标签: android android-file

我正在使用repository

中的RootTools库

授予应用程序root权限后,我尝试使用Root删除内部存储中的文件。

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

deleteStatus总是错误,文件也不会被删除。

我在这里做错了什么?

更新

我是ROOT使用的新手。我的应用程序中ROOT基本上只有很少的要求。

1)我需要检查设备上的ROOT是否可用。 (RootTools.isRootAvailable())

2)我需要向用户提供ROOT权限提示以获得GRANT root权限(RootTools.isAccessGiven())

3)删除文件和文件夹(RootTools.deleteFileOrDirectory)

除了删除方法外,一切都很完美。如何使用libsuperuser执行此操作?

1 个答案:

答案 0 :(得分:1)

RootTools不是最好的。就个人而言,我建议使用libsuperuser

有很多理由说明您的文件没有被删除。如果查看RootTools,它不会在路径周围添加引号。因此,如果您的文件包含空格,则不会删除它。

来自RootTools

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

应该是:

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);

您无需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时会执行此操作)。

这是一个冗长的答案。如果您还有其他问题,我建议您阅读图书馆项目的文档。