2014-06-18 27 views
8

Otrzymuję komunikat o błędzie podczas uruchamiania tego kodu, a błąd jest następujący: "Odmowa dostępu root [java.io.IOException]: Błąd z uruchomieniem komendy exec(). Command: [su] Working Katalog: null Środowisko: null "Błąd "Odmowa dostępu root" w aplikacji Android

try 
{ 
    suProcess = Runtime.getRuntime().exec("su"); 
    DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); 
    DataInputStream osRes = new DataInputStream(suProcess.getInputStream()); 

    if (null != os && null != osRes) 
    { 
     // Getting the id of the current user to check if this is root 
     os.writeBytes("id\n"); 
     os.flush(); 
     String currUid = osRes.readLine(); 
     boolean exitSu = false; 
     if (null == currUid) 
     { 
      retval = false; 
      exitSu = false; 
      Log.d("ROOT", "Can't get root access or denied by user"); 
     } 
     else if (true == currUid.contains("uid=0")) 
     { 
     retval = true; 
     exitSu = true; 
     Log.d("ROOT", "Root access granted"); 
     } 
     else 
     { 
     retval = false; 
     exitSu = true; 
     Log.d("ROOT", "Root access rejected: " + currUid); 
     } 

     if (exitSu) 
     { 
      os.writeBytes("exit\n"); 
      os.flush(); 
     } 
    } 
} 
catch (Exception e) 
{ 
    Log.d("ROOT", "Root access rejected [" + e.getClass().getName() 
       + "] : " + e.getMessage()); 
} 

Odpowiedz

2

Dzieje się tak, ponieważ aplikacje nie mają uprawnień superużytkownika w systemie Android.

+0

Próbuję zaimplementować kod, w którym muszę skompresować wideo za pomocą Androida, ale nie mogę znaleźć odpowiedniego API do tego. Czy możesz mnie poprowadzić? –

2

Cóż, po pierwsze ze wszystkich ... musisz zrootować swoje urządzenie. Pomoże w tym trochę Google Search.

Jeśli aplikacja będzie działać na anonimowych urządzeniach klienckich, należy najpierw sprawdzić, czy urządzenie jest zrootowane, czy nie. Moja biblioteka ma metodę sprawdzania dostępności rootów, która wygląda jak poniżej, ale nie działa w kilku przypadkach.

public static boolean hasRoot() { 
     String tags = Build.TAGS; 
     if ((tags != null) && tags.contains("test-keys")) 
      return true; 
     try { 
      if (new File("/system/app/Superuser.apk").exists()) 
       return true; 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
     String[] commands = { 
      "/system/xbin/which su", 
      "/system/bin/which su", 
      "which su" 
     }; 
     for (String command : commands) { 
      try { 
       Runtime.getRuntime().exec(command); 
       return true; 
      } catch (Exception exception) { 
       exception.printStackTrace(); 
      } 
     } 
     return false; 
    } 

Następnie można kontynuować procedurę wykonać superuser shell & czek na uid.

Jeśli chcesz uprościć różne rzeczy, możesz zajrzeć do mojej biblioteki interfejsu Android CLI z otwartym kodem źródłowym, dzięki której to zadanie będzie łatwiejsze. Możesz znaleźć projekt github here.

+0

Podczas korzystania z tego kodu, wyświetla "java.io.IOException: Błąd z uruchomieniem exec(). Polecenie: [/ system/xbin/which, su] Working Directory: null Środowisko: null" –

+1

Najprawdopodobniej nie jesteś już rootowany . Najpierw przejdź do rootowania, a następnie kontynuuj. –

Powiązane problemy