Thursday, 23 April 2015

Android Executing Shell Commands – Example

Executing Shell commands is useful to perform deep operating system operations.
In this tutorial we are going to see how to execute Linux shell commands with your Android Application.


Creating Layout

Our main layout consists of a EditText widget to get shell command as input. It also has a Button widget to execute the command. It also has a TextView widget to display the output of the command which is executed.

activity_main.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_gravity="center"
    tools:context=".MainActivity" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textAlignment="center"
        android:text="Shell Executer" />
    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txt"
        android:hint="Example - ls" />
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn"
        android:text="Execute" />
     <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/out"
        android:textAlignment="textStart" />
</LinearLayout>

Creating Activity

Before proceeding to MainActivity class we need to create ShellExecuter class which has the function to execute shell commands.
It has a function Executer which has a parameter command. The command is executed using the function Runtime.getRuntime().exec(command). 
Then we use BufferReader to read the output and parse it.

ShellExecuter.java
package com.example.androidshell;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ShellExecuter 
{
   public ShellExecuter() 
   { }
   public String Executer(String command) 
   {
      StringBuffer output = new StringBuffer();
      Process p;
      try 
      {
         p = Runtime.getRuntime().exec(command);
         p.waitFor();
         BufferedReader reader = 
         new BufferedReader(new  InputStreamReader(p.getInputStream()));
              String line = "";    
          while ((line = reader.readLine())!= null) 
          {
             output.append(line + "\n");
          }
      } 
      catch (Exception e) 
      {
        e.printStackTrace();
      }
      String response = output.toString();
      return response;
    }
}
In MainActivity we are initially importing the layout items. When the button is pressed the Executer() function is invoked and the output is displayed in a TextView.

MainActivity.java

package com.example.androidshell;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;
import com.example.androidshell.ShellExecuter;

public class MainActivity extends Activity 
{
  EditText input;
  Button btn;
  TextView out;
  String command;
  @Override
  protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    input = (EditText)findViewById(R.id.txt);
    btn = (Button)findViewById(R.id.btn);
    out = (TextView)findViewById(R.id.out);
    btn.setOnClickListener(new View.OnClickListener() 
{
      @Override
      public void onClick(View arg0) 
{
        // TODO Auto-generated method stub
        ShellExecuter exe = new ShellExecuter();
        command = input.getText().toString();
        String outp = exe.Executer(command);
        out.setText(outp);
        Log.d("Output", outp);
      }
    });
  }

}


No comments:

Post a Comment