Auf der Suche nach der Automatisierung von Gerätefunktionen stoßen Android-Entwickler häufig auf die Notwendigkeit, Shell-Befehle programmgesteuert auszuführen. Während dies über den Terminalemulator unkompliziert zu bewerkstelligen ist, kann die Ausführung derselben Befehle über Java zu Herausforderungen führen. Dieser Frage-und-Antwort-Artikel befasst sich mit der Frage, warum derselbe Befehl, der in einem Terminalemulator funktioniert, in Java möglicherweise nicht erfolgreich ist, und bietet eine Lösung zur Überwindung dieser Hürde.
Ein Entwickler, der versuchte, seinen Bildschirm mit dem neu eingeführten Befehl „screenrecord“ in Android KitKat aufzuzeichnen, bemerkte, dass der Befehl im Terminalemulator einwandfrei funktionierte, jedoch fehlschlug, wenn er in einer Java-Anwendung mit Process.exec() ausgeführt wurde. Sie suchten nach Rat, wo das Problem lag und wie es gelöst werden kann.
Der Kern des Problems ergab sich aus der Tatsache, dass der Befehl „screenrecord“ erhöhte Berechtigungen erfordert. wird normalerweise durch die Verwendung von „su“ (Superuser) gewährt. Beim Ausführen des Befehls über den Terminalemulator gibt der Benutzer manuell „su“ ein und erteilt damit die erforderlichen Berechtigungen. Bei der Ausführung des Befehls aus Java fehlte der Anwendung jedoch die erforderliche Elevation.
Die Lösung lag in der Aufforderung zum Root-Zugriff innerhalb des Java-Codes . Auf den Befehl „su“ folgt normalerweise eine neue Zeile und der Befehl, der ausgeführt werden muss. Indem der Entwickler den Standardeingabestrom des Prozesses „su“ abgreift und den Befehl hineinschreibt, könnte er das Verhalten des Terminalemulators effektiv nachahmen.
Der folgende Codeausschnitt veranschaulicht die Lösung:
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); }
Durch den Einsatz der bereitgestellten Lösung können Entwickler erfolgreich Shell-Befehle von Java-Anwendungen ausführen, selbst solche, die erhöhte Berechtigungen erfordern. Diese Technik eröffnet die Möglichkeit, verschiedene Gerätefunktionen zu automatisieren und die Anwendungsfunktionen zu verbessern.
Das obige ist der detaillierte Inhalt vonWarum funktioniert mein Shell-Befehl im Terminal, schlägt jedoch in Java fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!