Мне нужно установить разрешения для файла и его папки. Оба находятся в папке/data/folder на внутренней памяти. Единственное, что может сделать мое приложение, это:Невозможно выполнить более одной команды оболочки за один раз
String[] cmd = { "su", "-c", "chmod 777 " + myakDB.getParentFile().getPath()};
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor();
cmd = new String[] { "su", "-c", "chmod 666 " + myakDB.getPath() };
process = Runtime.getRuntime().exec(cmd);
process.waitFor();
Таким образом, он запрашивает Суперпользователя два раза за разрешением. Это нежелательное поведение, которое я предполагаю для пользователей моего приложения. Поэтому поиск той же проблемы через Интернет дал мне следующее решение (с использованием потока):
Process process = Runtime.getRuntime().exec("su");
DataOutputStream out = new DataOutputStream(process.getOutputStream());
out.writeBytes("chmod 777 " + myakDB.getParentFile().getPath());
out.writeBytes("chmod 666 " + myakDB.getPath());
out.writeBytes("exit\n");
out.flush();
Но это не работает. Иногда просто ничего не происходит, и иногда он запускает запрос суперпользователя, а затем вешает белый экран. Так что случилось с моим процессом?
Кажется, вам не хватает символа новой строки или точки с запятой для завершения первой и второй команд. Кроме того, пожалуйста, не делайте исполняемые файлы, доступные для всего мира - 777 - это почти всегда плохая идея. –
Прочитайте (и внесите) * все * рекомендации [Когда Runtime.exec() не будет] (http://www.javaworld.com/jw-12-2000/jw-1229-traps.html). Это может решить проблему. Если нет, он должен предоставить дополнительную информацию о причине отказа. Затем проигнорируйте, что он ссылается на 'exec' и создает' Process' с помощью 'ProcessBuilder'. Также разбивайте 'String arg' на' String [] args' для учета аргументов, которые сами содержат пробелы. –
>>> не делают исполняемые файлы доступными для всего мира - 777 Я не могу записать файл, если у него нет 777 разрешений. Я считаю, что это неправильно? – kolyaseg