2013-02-08 2 views
0

У меня есть приложение, которое должно выполнять некоторые корневые команды. Версия SuperSU - 1.04. Су версии 1.02. Android 4.1.1. Устройство Samsung Galaxy S3 - корневое.Не удается получить разрешение от SuperSU

Проблема в том, что я не могу получить запрос на разрешение от SuperSU. Я пробовал много вещей, но подсказка никогда не появляется.

Для базовых баз данных RootChecker, ADB и других приложений, которые он обнаружил. Вот моя процедура - может быть, я делаю что-то неправильно.

private static String runShellCommand(String command) { 
    DataOutputStream os = null; 
    Process process = null; 
    try { 
     String [] env = {"PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin"}; 
     process = Runtime.getRuntime().exec("su", env, Environment.getExternalStorageDirectory()); 
     os = new DataOutputStream(process.getOutputStream()); 

     InputStreamHandler err = new InputStreamHandler(process.getErrorStream(), false); 
     InputStreamHandler out = new InputStreamHandler(process.getInputStream(), false); 

     os.writeBytes(command + "\n"); 
     os.flush(); 

     os.writeBytes(EXIT); 
     os.flush(); 
     os.close(); 
     Log.d(LOGTAG, "Waiting on: " + process.waitFor()); 

     String errOut = err.getOutput(); 
     String stdOut = out.getOutput(); 

     Log.d(LOGTAG, "Exit code: " + process.exitValue()); 
     Log.d(LOGTAG, command + " erroutput: [" + errOut + "]"); 
     Log.d(LOGTAG, command + " output: [" + stdOut + "]"); 
     if (errOut != null && !errOut.equals("")) 
      return errOut; 
     else if (stdOut != null&& !stdOut.equals("")) 
      return stdOut; 
     else 
      return null; 
    } catch (Exception e) { 
     Log.e(LOGTAG, "runShellCommand error: ", e); 
     return null; 
    } finally { 
     try { 
      if (os != null) { 
       os.close(); 
      } 
      if (process != null) { 
       Log.d(LOGTAG, "Exit val: " + process.exitValue()); 
       process.destroy(); 
      } 
     } catch (Exception ignored) {} 
    } 
} 

обработчик InputStream является:

private static class InputStreamHandler extends Thread { 
    private final InputStream stream; 
    private final boolean devNull; 
    StringBuffer output; 

    public String getOutput() { 
     return output.toString(); 
    } 

    InputStreamHandler(InputStream stream, boolean devNull) { 
     this.devNull = devNull; 
     this.stream = stream; 
     output = new StringBuffer(); 
     start(); 
    } 

    @Override 
    public void run() { 
     try { 
      if (devNull) { 
       while (stream.read() != -1) {} 
      } else { 
       BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
       while (true) { 
        String line = br.readLine(); 
        if (line == null) { 
         Log.d(LOGTAG, "Ended with reading!"); 
         br.close(); 
         return; 
        } 
        output.append(line); 
       } 
      } 
     } catch (IOException ignored) { 
      Log.e(LOGTAG, "Error", ignored); 
     } 
    } 
} 

Кто-нибудь есть идея, почему это блокировать, так что не показывает окно разрешения? Спасибо.

+0

Что такое вывод stderr и stdout? –

+0

Нет выхода. У меня нет разрешения на запуск su из SuperSU. –

+0

Нечетный. Попробуйте очистить данные в SuperSU или с помощью суперпользователя, чтобы сузить проблему. –

ответ

0

Я, наконец, понял это. Хитрость заключается в создании процесса (выполнить Runtime.getRuntime(). Exec ("su");) отдельно в другом потоке. Я не уверен, почему это работает, но это так. Аналогичный способ используется в RootTools. Это решило мою проблему.

0

Я не совсем уверен, почему это не сработает. Первое, что меня поразило, - это пройти Environment.getExternalStorageDirectory() до exec. Может быть, этот (путь) не разрешен (для выполнения)?

Почему бы просто не использовать libsuperuser, написанный специально для выполнения этой самой задачи? Он с открытым исходным кодом, крошечный, полностью прокомментированный, имеет примерный проект и даже document detailing the common problems, который может возникнуть при попытке выполнить эту самую операцию.

+1

Даже если я использую Process.getRuntime(). Exec («su»), он блокирует, не запрашивая разрешения. –

+0

Я дам ему доступ к libsuperuser. Благодарю. –

+0

Это совсем не помогает. Ваш код похож на мой код. Проблема все еще не решена. –