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);
Edit:
Путь возвращаемый Environment.getExternalStorageDir()
не может быть прочитан в оболочке. Вам нужно будет изменить путь перед отправкой команды в оболочку.
Чтобы это исправить ваш может добавить следующий статический фабричный метод для вашего проекта:
/**
* 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
Чтобы проверить, если корневой доступ доступен и показать корень разрешения строки, можно вызвать следующий метод:
boolean isRooted = Shell.SU.available();
Библиотека, libsuperuser, не предназначена делать все, что пытается сделать RootTools. Если вы решите использовать libsuperuser, вам нужно будет отправить команды в оболочку.
Пример удаления файла с 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
) ,
Это длинный ответ. Если у вас появятся дополнительные вопросы, я бы предложил прочитать документацию для любого проекта библиотеки.
Можете ли вы вставить путь к файлу? –
Да, путь /storage/emulated/0/logo_large_new.png –