我正在使用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执行此操作?
答案 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
时会执行此操作)。
这是一个冗长的答案。如果您还有其他问题,我建议您阅读图书馆项目的文档。