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é?
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.
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
.
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 :)
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.
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é.