दिलचस्प पोस्ट
एचटीएमएल 5 कैनवास में क्रॉस-मूल डेटा EditText में setHintTextColor () क्या fgets () एक छोटी बफर के अनुरूप नल लौट रहा है? अनग्रेड ग्राफ़ में सभी चक्र ढूंढना सीएसएस का उपयोग कर छवि को घुमाने के लिए क्रॉस ब्राउज़र का रास्ता? फ़ाइल नाम में एक बृहदान्त्र के साथ विंडोज में एक फ़ाइल कैसे प्राप्त करें? क्या PHP सत्रों की मेरी समझ सही है? किसी प्रक्रिया आईडी से X11 विंडो कैसे प्राप्त करें? सीएसएस संक्रमण प्रभावों को अस्थायी रूप से अक्षम करने का सबसे साफ तरीका क्या है? UIImagePickerController स्क्रीन को भर नहीं करता है जब उपयोगकर्ता jQuery के साथ div के नीचे स्क्रॉल करता है ऐप (। एपीके) आकार को कैसे कम करें एकाधिक रंगीन पाठ के साथ एकल टेक्स्टदृश्य इंटर्न () जावा 6 और जावा 7 में अलग ढंग से व्यवहार कर रहा है स्विच स्टेटमेंट में स्ट्रिंग कैसे अगर एफ़-निविदा की तुलना में अधिक कुशल है?

सु प्रक्रिया के अंदर कमांड आउटपुट पढ़ें

सबसे पहले मैं अपनी स्थिति पेश करूंगा मुझे अपने एंड्रॉइड ऐप में "सु" कमांड को निष्पादित करने की आवश्यकता है और यह अच्छी तरह से काम करता है फिर मुझे "ls" कमांड निष्पादित करने और आउटपुट को पढ़ने की आवश्यकता है। मैं इसे "सु" प्रक्रिया से आउटपुट स्ट्रीम प्राप्त कर रहा हूं और इसमें मेरी कमांड लिख रहा हूं

और यहाँ सवाल है "एलएस" प्रक्रिया के आउटपुट को कैसे पढ़ें? मेरे पास सभी "सु" प्रक्रिया वस्तु है इससे इनपुट स्ट्रीम प्राप्त करना कुछ भी नहीं है, क्योंकि "सु" कुछ भी नहीं लिखता है लेकिन "ls" करता है और मुझे नहीं पता कि इसके आउटपुट संदेशों को कैसे पहुंचा है।

मैंने कई साइटों की खोज की है लेकिन मुझे कोई समाधान नहीं मिला। शायद कोई मेरी मदद करेगा 🙂

सादर

वेब के समाधान से एकत्रित समाधान "सु प्रक्रिया के अंदर कमांड आउटपुट पढ़ें"

ठीक है, मैंने एक समाधान पाया है I इसे ऐसा दिखना चाहिए:

Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"}); DataOutputStream stdin = new DataOutputStream(p.getOutputStream()); //from here all commands are executed with su permissions stdin.writeBytes("ls /data\n"); // \n executes the command InputStream stdout = p.getInputStream(); byte[] buffer = new byte[BUFF_LEN]; int read; String out = new String(); //read method will wait forever if there is nothing in the stream //so we need to read it in another way than while((read=stdout.read(buffer))>0) while(true){ read = stdout.read(buffer); out += new String(buffer, 0, read); if(read<BUFF_LEN){ //we have read everything break; } } //do something with the output 

आशा है कि यह किसी के लिए उपयोगी होगा

 public String ls () { Class<?> execClass = Class.forName("android.os.Exec"); Method createSubprocess = execClass.getMethod("createSubprocess", String.class, String.class, String.class, int[].class); int[] pid = new int[1]; FileDescriptor fd = (FileDescriptor)createSubprocess.invoke(null, "/system/bin/ls", "/", null, pid); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fd))); String output = ""; try { String line; while ((line = reader.readLine()) != null) { output += line + "\n"; } } catch (IOException e) {} return output; } 

यहां उल्लिखित इस कोड की जांच करें:

एंड्रॉइड एप्लिकेशन में टर्मिनल कमांड चलाने के लिए कैसे?


 try { // Executes the command. Process process = Runtime.getRuntime().exec("/system/bin/ls /sdcard"); // Reads stdout. // NOTE: You can write to stdin of the command using // process.getOutputStream(). BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); int read; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); while ((read = reader.read(buffer)) > 0) { output.append(buffer, 0, read); } reader.close(); // Waits for the command to finish. process.waitFor(); return output.toString(); } catch (IOException e) { throw new RuntimeException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } 

संदर्भ

यह कोड जीस्क्रिप्ट

मैंने निम्नलिखित समस्याओं के लिए @ ग्लोडोस द्वारा स्वीकार किए गए उत्तर को संशोधित किया है:

  1. नदियों को बंद कर दिया जाता है, अन्यथा निष्पादित प्रक्रिया खोला धारा पर हमेशा के लिए लटक जाती है। यदि आप कई निष्पादनों के बाद शेल (यानी adb shell ) में ps निष्पादित करते हैं तो आपको कई su प्रक्रियाओं को जीवित दिखाई देगा। उन्हें ठीक से समाप्त करने की जरूरत है
  2. यह सुनिश्चित करने के लिए waitFor() जोड़ा गया कि प्रक्रिया समाप्त हो गई है
  3. read=-1 लिए हैंडलिंग जोड़ा गया, अब खाली stdout साथ कमांड निष्पादित किए जा सकते हैं। इससे पहले कि वे new String(buffer, 0, read) पर क्रैश हो गए
  4. अधिक कुशल स्ट्रिंग हैंडलिंग के लिए स्ट्रिंगबफ़र का उपयोग करना

     private String execCommand(String cmd) throws IOException, InterruptedException { Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"}); DataOutputStream stdout = new DataOutputStream(p.getOutputStream()); stdout.writeBytes(cmd); stdout.writeByte('\n'); stdout.flush(); stdout.close(); BufferedReader stdin = new BufferedReader(new InputStreamReader(p.getInputStream())); char[] buffer = new char[1024]; int read; StringBuffer out = new StringBuffer(); while((read = stdin.read(buffer)) > 0) { out.append(buffer, 0, read); } stdin.close(); p.waitFor(); return out.toString(); } 

कुछ क्रेडिट @ शेरीफ एलखिताब को जाते हैं))