Dans leur quête d'automatisation des fonctionnalités des appareils, les développeurs Android rencontrent souvent le besoin d'exécuter des commandes Shell par programme. Bien que cela soit simple à partir de l'émulateur de terminal, exécuter les mêmes commandes à partir de Java peut présenter des défis. Cet article de questions-réponses explique pourquoi la même commande qui fonctionne dans un émulateur de terminal peut ne pas réussir en Java et fournit une solution pour surmonter cet obstacle.
Un développeur tentant d'enregistrer son écran à l'aide de la nouvelle commande screenrecord dans Android KitKat a remarqué que la commande fonctionnait parfaitement dans l'émulateur de terminal, mais échouait lorsqu'elle était exécutée à partir d'une application Java à l'aide de Process.exec(). Ils ont demandé des conseils sur l'origine du problème et comment le résoudre.
Le nœud du problème provenait du fait que la commande screenrecord nécessite des autorisations élevées, généralement accordé avec l'utilisation de «su» (super-utilisateur). Lors de l'exécution de la commande depuis l'émulateur de terminal, l'utilisateur fournit 'su' manuellement, en accordant les autorisations nécessaires. Cependant, lors de l'exécution de la commande à partir de Java, l'application ne disposait pas de l'élévation requise.
La solution consistait à demander l'accès root dans le code Java. . La commande « su » est généralement suivie d'une nouvelle ligne et de la commande qui doit être exécutée. En récupérant le flux d'entrée standard du processus 'su' et en y écrivant la commande, le développeur pourrait efficacement imiter le comportement de l'émulateur de terminal.
L'extrait de code suivant illustre la solution :
try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n"); outputStream.flush(); outputStream.writeBytes("exit\n"); outputStream.flush(); su.waitFor(); }catch(IOException e){ throw new Exception(e); }catch(InterruptedException e){ throw new Exception(e); }
En utilisant la solution fournie, les développeurs peuvent exécuter avec succès des commandes shell à partir d'applications Java, même celles nécessitant des autorisations élevées. Cette technique ouvre la possibilité d'automatiser diverses fonctions de l'appareil et d'améliorer les capacités des applications.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!