Android - exécution de la ligue des commandes par programme ne fonctionne pas
J'ai besoin de mon application pour effectuer certaines su
commandes par programme (le téléphone est enracinée).
Lorsque le fait à l'aide de la bad, les commandes de travail.
Par exemple:
su -c "mkdir /sdcard/testdir"
crée un répertoire appelé "testdir" dans /sdcard.
Quand je l'appelle:
p = Runtime.getRuntime().exec("su -c \"mkdir /sdcard/testdir\"");
p.waitFor();
Elle se déplace sur et aucun changement ne se produit.
J'ai essayé la lecture de l'entrée:
DataInputStream dis = new DataInputStream(p.getInputStream());
while((temp = dis.readLine())!=null)
Log.d(ctx.TAG,"shell:"+temp);
Mais il rapporte rien (boucle n'0 itérations).
Quelqu'un a jamais été confronté à ce problème avant? Comment peut-il être résolu?
Inutile de journée, non-su commandes n'travail en programmant avec cette méthode.
Remarque: j'ai donné mkdir
comme un exemple (je sais que ça ne nécessite pas forcément su). J'ai besoin de beaucoup de diverses commandes à exécuter dans le cadre su
Merci!
EDIT: quand je l'appelle su -c "id"
par programmation, il y a une sortie qui uid=0.
OriginalL'auteur LoneDuck | 2015-04-20
Vous devez vous connecter pour publier un commentaire.
Je peux rester bloqué sur un problème pendant des jours, et au moment où je rassemble le courage de demander à ce sujet sur StackOverflow, il est résolu en quelques minutes.
La solution est:
N'oubliez pas
\n
à la fin de chaque commande que vous écrivez à laDataOutputStream
, car il ne fonctionnera pas sans lui.il est d'avoir d'erreur java.io.IOException: Impossible d'exécuter le programme "su": erreur=13, Autorisation refusée
OriginalL'auteur LoneDuck
Vous avez écrit que vous avez "besoin varié commandes à exécuter en vertu su". Notez que l'utilisation de "Runtime.exec()" est découragée par Chainfire, le développeur de la plus célèbre SuperSU racine de l'application.
Voir le Comment SU Document. De sorte que vous pouvez suivre sa recommandation ici:
OriginalL'auteur tony
Si vous utilisez des guillemets, ça marche:
OriginalL'auteur Bruce Bane
Vous pourrait être l'appel de
Runtime.getRuntime().exec()
dans le thread principal etp.waitFor()
rend votre thread principal d'attendre jusqu'à ce qu'il exécute. Essayez d'appeler dans un autre thread, comme l'extrait suivant.testdir
est créé dans /sdcard.Est votre sdcard monté? Vérifiez le chemin d'accès "/sdcard".
Oui, et
su -c "mkdir /sdcard/testdir"
fonctionne si elle est effectuée dans la commande adb shell.OriginalL'auteur Aswin