web-dev-qa-db-fra.com

Est-il possible d'exécuter des commandes adb via mon application Android?

Est-ce que n'importe qui peut dire, si les commandes adb peuvent être exécutées par mon application Android. S'il est possible d'exécuter, comment cela peut-il être implémenté?

25
RajeshVijayakumar

Vous pouvez le faire avec ceci: 

Process process = Runtime.getRuntime().exec("your command");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));

N'oubliez pas de l'entourer d'une déclaration try and catch.

Modifier:

@ Phix a raison, ProcessBuilder serait préférable d'utiliser.

25
Ahmad

Les applications Android normales ont des privilèges différents sur les processus démarrés via adb, par exemple, les processus démarrés via adb sont autorisés à capturer l'écran, contrairement aux applications normales. Vous pouvez donc exécuter des commandes à partir de votre application via Runtime.getRuntime().exec(), mais elles n'auront pas les mêmes privilèges que si vous l'aviez exécutée à partir d'un adb Shell.

14
Christopher Fraser

je suis tombé sur ce message à la recherche d’une requête différente, mais j’ai travaillé spécifiquement avec input sur Android auparavant, je voudrais donc clarifier la situation. 

La raison pour laquelle 

Runtime.getRuntime().exec("adb Shell input keyevent 120");    

Ne fonctionne pas, c'est parce que vous ne retirez pas 

adb Shell   

La partie ADB est uniquement destinée à être utilisée sur votre ordinateur. Si vous avez installé ADB de manière incorrecte, la commande serait en fait un chemin d'accès au fichier adb.exe de votre ordinateur, comme ceci 

C:\XXXX\ADB Files\adb.exe Shell    

ou
C:\XXXX\Fichiers ADB\adb Shell 

La partie Shell indique au programme ADB de votre ordinateur d’accéder au périphérique Shell, afin que votre périphérique ne sache pas ce qu’est le shell ... 

Utiliser sh /path/to/commandList.sh exécutera les commandes répertoriées dans commandList.sh car il s’agit d’un script Shell (un fichier .batch sous Windows est similaire) 

La commande que vous voulez utiliser est 

Runtime.getRuntime().exec("input keyevent 120");     

Cependant, cela causera Environment null et le répertoire de travail null, vous pouvez le contourner en écrivant les commandes dans un script Shell (fichier .sh), puis en exécutant le script avec 

Runtime.getRuntime().exec("sh path/to/shellScript.sh");   

Parfois, la sh n'est pas nécessaire, mais je l'utilise simplement en cas. 

J'espère que cela efface au moins quelque chose :)

0
Zillinium

L'exécution

Runtime.getRuntime().exec("adb Shell input keyevent 120");

J'ai eu l'erreur suivante: Java.io.IOException: Impossible d'exécuter le programme "adb": error = 13, autorisation refusée. 

L'exécution 

Runtime.getRuntime().exec("adb Shell input keyevent 120");

Il n'y a pas d'erreur mais en même temps, ma demande n'est pas traitée pour prendre la capture d'écran.

J'ai découvert que cela fonctionnait dans les versions précédentes d'Android, mais que cela a été supprimé par la suite. Bien que je ne sois pas en mesure de fournir la source ici pourquoi cela ne fonctionne pas. 

J'espère que cela aidera quelqu'un comme moi qui essaie d'utiliser cette approche pour prendre la capture d'écran lorsque l'application n'est pas au premier plan.

0

shell adb appelé dans Runtime.getRuntime (). exec ne s'exécute pas sous l'utilisateur Shell. Il fournit Shell mais avec le même utilisateur propriétaire du processus (comme u0_a44). C'est la raison pour laquelle tout commandement n'a pas fonctionné.

0
Pratik Agrawal