2013-02-08 67 views
0

我有一個應執行某些根命令的應用程序。 SuperSU版本是1.04。 蘇版本是1.02。 Android 4.1.1。 設備是三星Galaxy S3 - 紮根。無法從SuperSU獲得許可提示

問題是我無法從SuperSU獲得許可提示。 我已經嘗試了很多東西,但提示永遠不會出現。

對於RootChecker basic,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的輸出是什麼? – 2013-02-08 22:28:48

+0

沒有輸出。我沒有獲得從SuperSU運行su的許可。 – 2013-02-09 10:53:34

+0

奇數。嘗試清除SuperSU上的數據,或使用超級用戶縮小問題範圍。 – 2013-02-09 15:21:00

回答

0

我終於明白了。竅門是創建一個進程(在另一個線程中分別執行Runtime.getRuntime()。exec(「su」);)。我不確定這是爲什麼會起作用,但確實如此。 在RootTools中使用了類似的方法。 這解決了我的問題。

0

我不完全確定爲什麼這不起作用。令我感到奇怪的第一件事是通過Environment.getExternalStorageDirectory()exec。也許這(路徑)是不允許的(執行)?

爲什麼不簡單地使用libsuperuser,專門編寫來執行此任務?它是開源的,很小,完全評論,有一個示例項目,甚至在嘗試執行此操作時可能會遇到。

+1

即使我使用Process.getRuntime()。exec(「su」),它也會阻止,而不會詢問權限 – 2013-02-08 21:32:32

+0

我會用libsuperuser來解決它。謝謝。 – 2013-02-08 21:34:07

+0

它根本沒有幫助。您的代碼與我的代碼類似。問題仍然沒有解決。 – 2013-02-10 10:41:18