2010-09-15 7 views
0

J'essaie d'exécuter des commandes shell, cela fonctionne comme prévu. Même le résultat revient (comme c'est le cas sur LogCat). Le problème est la dernière ligne du résultat. Chaque fois qu'un readLine() sur la dernière ligne se produit (ce qui ne devrait pas se produire, temp doit être nul), l'application se bloque pour toujours et ne revient pas de l'appel readLine. Peut-être que vous trouvez l'erreur. J'ai essayé readUTF et standart read(), tout le même problème. Et oui, l'application a su-droits.L'obtention du résultat de la commande shell exécutée échoue/se bloque

try 
       { 
        Process process = Runtime.getRuntime().exec("su"); 
        DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
        DataInputStream osRes = new DataInputStream(process.getInputStream()); 
        for (String single : commands) { 
         os.writeBytes(single + "\n"); 
         os.flush(); 
         String temp = new String(); 
         while( (temp = osRes.readLine()) != null) 
         {          
          Log.v("NITRO", temp); 
          result2 += temp + "\n";        
         }      
        } 
        os.writeBytes("exit\n"); 
        os.flush(); 
        process.waitFor(); 
       } catch (IOException e) 
       { 
        Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG); 
       } catch (InterruptedException e) 
       { 
        Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG); 
       } 

C'est le StackTrace où il se bloque lorsque j'arrête débogueur quand la pendaison:

OSFileSystem.readImpl(int, byte[], int, int) line: not available [native method]  
OSFileSystem.read(int, byte[], int, int) line: 118 
ProcessManager$ProcessInputStream(FileInputStream).read(byte[], int, int) line: 312 
ProcessManager$ProcessInputStream(FileInputStream).read() line: 250 
DataInputStream.readLine() line: 309  
Main$2$1.run() line: 84 
ViewRoot(Handler).handleCallback(Message) line: 587 
ViewRoot(Handler).dispatchMessage(Message) line: 92 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 4627  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 521 
ZygoteInit$MethodAndArgsCaller.run() line: 868 
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method] 
+1

un tir dans le noir ici, essayez de déplacer le 'exit' avant la boucle while? – st0le

+0

Vous devriez adresser votre réponse à @ st0le ou il pourrait ne jamais être vu. –

+0

@ st0le vous avez raison, cela a fonctionné, merci. attrapé cela à partir d'un exemple, là la sortie était après que les commandes. Mais je veux juste exécuter une commande, donc cela devrait fonctionner. Vous pouvez le poster comme réponse, que je peux l'accepter. – ludwigm

Répondre

0

Essayez de déplacer la sortie avant que la boucle while ... Vous êtes application se termine jamais, d'où la boucle while ne se termine jamais .... Déplacer le exit devrait provoquer l'application de se terminer ce qui devrait provoquer la boucle pour obtenir un null ...