2015-08-22 2 views
-1

Я использую библиотеку RootTools из hereRootTools.deleteFileOrDirectory всегда возвращает ложь

После предоставления привилегии суперпользователя приложения, я пытаюсь удалить файл во внутреннем хранилище с помощью Root.

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

deleteStatus всегда оказывается ложным, и файл также не удаляется.

Что я здесь делаю неправильно?

UPDATE

Я новичок с использованием ROOT. У меня в основном очень мало требований в моем приложении с ROOT.

1) Мне нужно проверить, доступен ли ROOT на устройстве. (RootTools.isRootAvailable())

2) Мне нужно дать разрешение ROOT запрос пользователю на GRANT корень разрешения (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); 

Оно должно быть:

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


Это длинный ответ. Если у вас появятся дополнительные вопросы, я бы предложил прочитать документацию для любого проекта библиотеки.

+0

Спасибо за ответ. На самом деле, если мне нужно переместить библиотеку в этот момент, тогда мне нужно будет внести множество изменений. И мне нравится использовать libsuperuser. Как изменить метод удаления в RootTools так, чтобы он работал отлично. –

+0

Вы можете открыть вопрос о GitHub. Я обновил свой ответ. Мой ответ должен работать, так как ваш файл не содержит пробелов. –

+0

На самом деле, я тестирую внутреннее хранилище. Но пользователи могут также иметь файлы на внешней SD-карте и могут иметь имена файлов с пробелами. Будет ли этот новый метод решать обе проблемы? –

 Смежные вопросы

  • Нет связанных вопросов^_^